单例
单:惟一性。例:实例对象。就是使用某个类建立的对象是程序中惟一的实例对象。(一般每次使用alloc建立的是不一样的对象)web
若是一个类只能建立一个对象,称为单例类,能够工具类,视图类,控制器类设计模式
特色:全局均可以被访问到,操做单例对象的变量不会被释放,每次获取的对象都是同一个对象,只建立一次多线程
建立:建立单例对象的方法,通常都为类方法,命名规则为share+类名 或者 standard+类名工具
注意: (1)操做单例对象的变量存储在静态区,程序关闭后由系统自动回收 (2)单例对象存储在堆区,不释放,程序关闭后由系统自动回收 (3)变量与单例对象的生命周期与程序同步性能
优点: (1)在内存中只有一个对象,节省内存空间 (2)避免频繁的建立销毁对象,能够提升性能 (3)避免对共享资源的多重占用 (4)能够全局访问 (5)下降模块之间的藕合度,下降代码的复杂度spa
伪单例与完整单例
根据须要咱们实现的单例有伪单例和完整单例两种:线程
伪单例:只有经过该方法获取到的才是同一对象,通常状况下咱们本身的单例类多采用伪单例的建立方式,不须要实现完整的单例设计
@implementation DataHandle
static DataHandle *handle = nil; +(DataHandle *)shareInstance { //@synchronized为同步锁,在该大括号的代码段在多线程的时候受保护,一次只可以有一个线程执行,当多个线程访问改单例的时候,后面的等待!!! @synchronized(self){ if(nil == handle)//判断以前是否开辟了空间 { //当建立完整的单例,要避免死循环的问题 handle = [[DataHandle alloc]init]; } } return handle; }
完整单例:不只经过特定方法获取到的是同一对象,进行alloc copy mutlcopy获取到的也是同一个对象,就须要咱们重写这些方法作一些内部实现code
例如:SingleTon为单例名对象
static SingleTon *singleTon = nil;
+(SingleTon *)shareSingleTon { @sychronized{ if(singleTon == nil) { singleTon = [super allocWithZone:nil]init]; } } } + (instancetype)alloc { return [SingleTon shareSingTon]; } +(instancetype)allocWithZone:(struct _NSZone *)zone { return [SingleTon shareSingTon]; } -(id)copy { return [SingleTon shareSingTon]; } -(id)mutableCopy { return [SingleTon shareSingTon]; } -(oneway void)release { // 返回值为空,不作任何操做 } -(NSUInteger)retainCount { // 返回整形最大数 return NSUIntegerMax; }