iOS设计模式反思之单例模式的进化

实例代码可以从DZSinglonExample找到


单例模式

什么是单例模式? 单例模式想一个大独裁者,他规定在他的国度里面,所有数据的访问和请求都得经过他,甚至你要调用相关的函数也得经过它。学术一点就是,单例模式,为某一类需求和数据提供了统一的程序接口。主要的实现技术就是,确保全局只有一个对象的实例存在。举个例子把,比如NSNotificationCenter 中的 defaultCenter 负责全局的消息分发、NSFileManager 的 defaultManager 统一负责物理文件的管理、NSUserDefaults 的 standardUserDefaults 统一管理用户的配置文件……不一而足。在整个iOS框架中,可以说是大规模使用了单例模式。

单例模式的原理及实现

在非ARC情况下实现一个单例

首先要初始化一个该类的静态化变量

在这里进行了加锁处理,是为了防止多线程重入的情况下,造成静态变量多次分配内存和初始化,从而会导致数据混乱。这里加锁的对象是self,实际上是

类DZSinglonNoARC的class对象,也就是说加锁对象是全局唯一的一个Class对象。而且在这里share的定义放在了函数shareInstance之内,是要让share变成一个函数内的局部变量这样可以防止,外部的异常访问。看到网上有些教程中,把share的定义放在函数之外,变成了文件内的一个全局静态变量,这样会存在其他函数异常操作share的情况。

注意在初始化share的时候我们使用的是

之所以这样做,是为了防止想用[DZSinglonNoARC alloc]等函数的时候,会与allocWithZone引起的死锁和死循环。

而关于此处加锁的处理还有一个优化版本,在4.0以上的SDK有了闭包之后,我们可以这么做

使用dispatch_once体带原来的加锁操作,这样做的好处就是可以减少每次加锁的时间,优化了程序性能。dispatch_once函数接收一个dispatch_once_t用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于share实例的实例化