一个完美的单例模式的实现方式
不推荐直接使用:XXXClass *obj = [XXXClass [alloc] init];方式获取单例对象
建议直接使用shareInstance获取单例对象,这样跟官方统一
代码实现方式
/** * 全局的static的实例,直到程序退出才被销毁 */ static id _instance; /** * 控制只分配一份内存空间,alloc方法会调用这个方法来分配内存 */ +(instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^ { _instance = [super allocWithZone:zone]; }); return _instance; } /** * 控制只初始化一次,保证[[xxx alloc] init]也是唯一的对象 */ -(instancetype)init { __block typeof(self) onceSelf = self; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^ { onceSelf = [super init]; if(onceSelf) { // 自定义初始化代码 } }); return onceSelf; } /** * 提供一个类方法供外界快速获取单例对象 */ +(instancetype)sharedInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^ { _instance = [[self alloc] init]; }); return _instance; } /** * 控制拷贝对象也是同一个示例,可以不遵守<NSCopying>协议 */ -(id)copyWithZone:(NSZone *)zone { return _instance; } |