个人技术总结--iOS单例模式

这个作业属于哪个课程 2021春软件工程实践/S班
这个作业要求在哪里 软件工程实践总结&个人技术博客
这个作业的目标 个人技术总结
其他参考文献 iOS编程(第四版)

类方法和实例方法

在介绍单例模式之前,我们先简单来区分一下:类方法和实例方法。

  • 类方法:即方法是建立在类的层面,主要用于对象的创建,获取某些全局的属性,不作用在对象上,对于任意的对象实例具有普适性(即不会因为对象不同对方法造成什么影响),简单来说就是直接可以通过类来调用该方法,一般用在对于不同的对象该方法操作都相同的情况下。我们要介绍的单例模式即为类方法。声明时在前面使用“+”。
  • 实例方法:用来操作类的实例对象,是向类的实例对象来发送消息,即需要通过对象进行调用。声明前利用“-”。

所以从本质上,两种方法发送消息的对象并不相同。

UIButton *button = [[UIButton alloc]init];

分析最简单的上述初始化语句:alloc方法是创建实例对象,是一个类方法,其发送消息的对象是UIButton类;创建了实例对象以后再调用init初始化方法,则是一个实例方法,因为其发消息的对象是一个实例对象。

什么是单例模式?

顾名思义,单例模式就是“一个类只有一个实例”。单例模式确保某一个类只有一个实例对象,即每次创建都会是同一个实例对象,所以每个位置调用该类的实例对象其实都是指向同一个实例。这个类也称为单例类。

比如正常而言对于一个类来说,下述语句中的两个button1和button2是两个不一样的button。

UIButton *button1 = [[UIButton alloc]init];

UIButton *button2 = [[UIButton alloc]init];

而对于单例类来说,每次创建的对象实例都会是同一个对象,即应该是同一个button。

为什么要使用单例?

  • 单例一般可以使用于模型数据层类的处理(即MVC设计模式中的Model层),比如我们微信的聊天记录,它就是独有一份,不论你在哪个设备上登录,他都是同一份聊天记录,因为每次创建的都是同一个对象。利用单例可以做到对象的统一性,在不同的类对该类的实例进行操作时,只需要再次创建,但是都是对同一份数据进行操作,则使程序在各处对这一份数据可以做到统一的处理,不会出现程序数据的混乱。
  • 这里简单的介绍一些MVC设计模式中的单例模式,如果在MVC设计模式中使用单例模式创建对象的话,则当一个View修改了Model层中的一个数据对象(接下来称它为对象A),则由于对象A是类的唯一的一个实例对象,则当这个对象A改变了,如果其他的View也引用了这个对象A,则会实时刷新为新的数据,从而实现在各个地方数据信息的统一管理。

在iOS中如何实现单例模式?

  • 前面我们提到类方法可以用于对象创建,而单例要做的就是一个类只有一个实例对象,所以应该创建一个新的类方法。在”.h文件“中声明该类方法。因为是类方法,所以声明利用“+”。
+ (instancetype)sharedItem;  //创建单例
  • 接下来在".m文件"中实现该方法
+ (instancetype)sharedItem
{
  //创建一个静态实例变量sharedStore,因为静态变量只会被初始化一次
  //则第二次调用该方法的时候sharedStore就不会再被初始化
  //此时把它设置为nil
  //CardStore是一个类
  static CardStore *sharedStore=nil;
  //如果是第一次调用,则sharedStore对象为空,进入执行语句
  if(!sharedStore){
    //为空就创建一个实例
 		sharedStore=[[CardStore alloc]init];
  }
  //不是第一次调用,不为空,则直接返回原本的实例对象
  //所以每一次返回的都会是同一个对象
  return sharedStore;
}
  • 实现流程图如下:

总结

关键在于利用了静态变量只会初始化一次的特性,来完成实例变量的设置。

则在其他的类里面创建CardStore类的实例对象,都会是同一个实例对象。

应该使用下述语句创建实例对象,则下述语句中的item1和item2都是同一个实例对象。

CardStore *item1 = [CardStore sharedItem];

CardStore *item2 = [CardStore sharedItem];
posted @ 2021-06-27 21:42  Chutiiing  阅读(115)  评论(0编辑  收藏  举报