你的位置:首页 > 操作系统

[操作系统]iOS开发笔记2:单例模式(singleton)


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

单例设计及要点

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

    其中有几点要注意:

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

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

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

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

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

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

GCD方式实现单例

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

    

static的作用

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

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

    

 

MRC环境下使用单例

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