每个app有且仅有一个UIApplication,相似UIApplication“ [UIApplication sharedApplication]”这种一个类有且仅有惟一实例的设计即单例模式。
安全
一个单例类设计以下图所示app
其中有几点要注意:spa
(1)实例须要用static,防止在其余文件中被修改;线程
(2)鉴于开发习惯,因此类方法都是以“sharedXXX"命名,并在其中进行惟一一次实例化;设计
(3)alloc时会调用allocWithZone方法,为了保持单例,须要重写该方法;3d
(4)检查两次实例是否为nil是有不一样含义的,第一次检查实例是否为nil也就是常说的双重检查锁,避免重复加锁。由于当第一次实例化后,后续每次获取实例时没有必要进行加锁等操做,直接返回实例便可,第二次检查实例是否为nil很明显就是为了保证明例惟一了。对象
(5)加锁@synchronized的意义在于保证线程安全,避免_instance为nil时恰好多个线程同时获取实例,因而同时产生了多个实例。经过加锁来保证同一时刻只能有一个线程进行调用,确保单例;blog
(6)为了防止copy时产生新的实例,一样对copyWithZone进行了从新,保证单例作用域
GCD方式单例设计以下图所示开发
static修饰全局变量的做用在于限制其做用域,使变量只在定义的源文件内有效。
反之,若是咱们去掉static的修饰,就能够在外部其余文件进行引用并修改变量,也就破坏单例了。
若是是在MRC环境下使用单例,除了上述设计外还要进行一些重写,使对象引用计数永远为1