创建单例模式的两种方法:
1.第一种:互斥锁:
<1>.在 .m 文件中保留一个全局的 static 的实例.
static id _instance;
<2>.重写若干方法(allocWithZone:和 copyWithZone:)并提供一个类方法让外界访问唯一的实例.
//(1)重写 allocWithZone:方法,在这里创建唯一的实例(注意线程安全). // alloc 内部都会调用这个方法. +(instancetype)allocWithZone:(struct _NSZone *)zone { if (_instance == nil) { // 防止频繁加锁 @synchronized(self) { if (_instance == nil) { // 防止创建多次 _instance = [super allocWithZone:zone]; } } } return _instance; }
//(2)重写 copyWithZone:方法. +(id)copyWithZone:(struct _NSZone *)zone { return _instance; }
//(3)提供1个类方法让外界访问唯一的实例 +(instancetype)shareSingleton { if (!_instance) { // 防止频繁加锁 @synchronized(self){ if (!_instance) { // 防止创建多次 _instance = [[self alloc] init]; } } } return _instance; }
2.第二种:一次性代码:
<1>.在 .m 文件中保留一个全局的 static 的实例.
static id _instance;
<2>.重写若干方法(allocWithZone:和 copyWithZone:)并提供一个类方法让外界访问唯一的实例.
//(1)重写 allocWithZone:方法,在这里创建唯一的实例(注意线程安全). + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super allocWithZone:zone]; }); return _instace; }
//(2)重写 copyWithZone:方法. +(id)copyWithZone:(struct _NSZone *)zone { return _instance; }
//(3)提供1个类方法让外界访问唯一的实例 + (instancetype)shareSingleton { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [[self alloc] init]; }); return _instace; }