iOS开发笔记2:单例模式(singleton)

时间:2024-12-16 12:35:26

每一个app有且仅有一个UIApplication,类似UIApplication“ [UIApplication sharedApplication]”这种一个类有且仅有唯一实例的设计即单例模式。

单例设计及要点

一个单例类设计如下图所示

iOS开发笔记2:单例模式(singleton)

其中有几点要注意:

(1)实例需要用static,防止在其他文件中被修改;

(2)鉴于开发习惯,所以类方法都是以“sharedXXX"命名,并在其中进行唯一一次实例化;

(3)alloc时会调用allocWithZone方法,为了保持单例,需要重写该方法;

(4)检查两次实例是否为nil是有不同含义的,第一次检查实例是否为nil也就是常说的双重检查锁,避免重复加锁。因为当第一次实例化后,后续每次获取实例时没有必要进行加锁等操作,直接返回实例即可,第二次检查实例是否为nil很明显就是为了保证实例唯一了。

(5)加锁@synchronized的意义在于保证线程安全,避免_instance为nil时刚好多个线程同时获取实例,于是同时产生了多个实例。通过加锁来保证同一时刻只能有一个线程进行调用,确保单例;

(6)为了防止copy时产生新的实例,同样对copyWithZone进行了重新,保证单例

GCD方式实现单例

GCD方式单例设计如下图所示

iOS开发笔记2:单例模式(singleton)

static的作用

static修饰全局变量的作用在于限制其作用域,使变量只在定义的源文件内有效。

反之,如果我们去掉static的修饰,就可以在外部其他文件进行引用并修改变量,也就破坏单例了。

iOS开发笔记2:单例模式(singleton)iOS开发笔记2:单例模式(singleton)

MRC环境下使用单例

如果是在MRC环境下使用单例,除了上述设计外还要进行一些重写,使对象引用计数永远为1

iOS开发笔记2:单例模式(singleton)