个人技术总结--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];