1、概念objective-c
单例模式是一种经常使用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。经过单例模式能够保证系统中一个类只有一个实例并且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。若是但愿在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。设计模式
通俗的说来:单例模式用于当一个类只能有一个实例的时候。多线程
1.单例模式须要达到的目的:
• 封装一个共享的资源
• 提供一个固定的实例建立方法
• 提供一个标准的实例访问接口spa
2.单例模式的要点:线程
显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行建立这个实例;三是它必须自行向整个系统提供这个实例。设计
3.单例模式的优势:code
1.实例控制:Singleton 会阻止其余对象实例化其本身的 Singleton 对象的副本,从而确保全部对象都访问惟一实例。对象
2.灵活性:由于类控制了实例化过程,因此类能够更加灵活修改实例化过程blog
1 @interface SingleInstance : NSObject 2 //定义一个类方法,返回当前对象的实例 3 + (instancetype) sharedInstance; 4 @end
②在.m文件中定义一个静态的当前单例对象的实例,并赋值为nil接口
1 static SingleInstance *instance = nil;
二、实现一个实例构造方法检查上面声明的静态实例是否为nil,若是是则新建并返回一个本类的实例
①第一种实现方法
1 //防止多线程同时执行,而建立多个对象 2 @synchronized(self) 3 { 4 //当前对象为空 5 if (!instance) 6 { 7 instance = [[self alloc] init]; 8 } 9 10 return instance; 11 }
②第二种实现方法(推荐使用)
1 static dispatch_once_t onceToken; 2 dispatch_once(&onceToken, ^{ 3 instance = [[self alloc] init]; 4 }); 5 6 return instance;
三、重写allocWithZone方法,用来保证其余人直接使用alloc和init试图得到一个新实力的时候不产生一个新实例
1 //alloc会触发,从新allocWithZone方法,防止经过alloc建立一个新的对象 2 + (instancetype)allocWithZone:(struct _NSZone *)zone 3 { 4 if (!instance) 5 { 6 instance = [super allocWithZone:zone]; 7 } 8 9 return instance; 10 }
四、适当实现allocWitheZone,copyWithZone,release和autorelease。
1 + (id)copyWithZone:(struct _NSZone *)zone 2 { 3 return self; 4 } 5 6 + (id)mutableCopyWithZone:(struct _NSZone *)zone 7 { 8 return self; 9 } 10 11 - (instancetype)retain 12 { 13 return self; 14 } 15 16 - (oneway void)release 17 { 18 19 } 20 21 - (instancetype)autorelease 22 { 23 return self; 24 } 25 26 - (NSUInteger)retainCount 27 { 28 return MAXFLOAT; 29 }