创建单例的两种方式(懒汉式&GCD)

来源:互联网 发布:分享文章赚钱系统源码 编辑:程序博客网 时间:2024/06/03 05:06

懒汉式:

// 创建静态全局变量static id instance;// 重写allocWithZone方法+(instancetype)allocWithZone:(struct _NSZone *)zone{    if (instance == nil) {    // 如果对象为空,那么再加锁(防止频繁加锁)        @synchronized(self) {            if (instance == nil) {            // 防止创建多次                instance = [super allocWithZone:zone];            }        }    }    return instance;}// 封装一个初始化方法方便初始化对象的时候使用+(instancetype)sharedLanHan{    if (instance == nil) {        @synchronized(self) {            if (instance == nil) {                instance = [[super alloc] init];            }        }    }    return instance;}-(id)copyWithZone:(NSZone *)zone{    // 防止copy时候产生新对象    return instance;}

GCD:

// 创建静态全局变量static id _instance;+(instancetype)allocWithZone:(struct _NSZone *)zone{    // GCD确保代码只执行一次,并且有线程保护    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [super allocWithZone:zone];    });    return _instance;}+(id)sharedGCD{    static dispatch_once_t onceToken;    dispatch_once(&onceToken, ^{        _instance = [[super alloc] init];    });    return _instance;}-(id)copyWithZone:(NSZone *)zone{    return _instance;}
0 0
原创粉丝点击