博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建单例
阅读量:5377 次
发布时间:2019-06-15

本文共 978 字,大约阅读时间需要 3 分钟。

背景

很多时候,我们在网上,或者开源项目中,看到类似下面这样创建一个单例:

+(MyClass *)singleton {    static MyClass *shared = nil;    if(shared == nil) {        shared = [[MyClass alloc] init];    }    return shared;}

但是,上面的代码在很多层面是错误的。首先,它不是线程安全的,当多个线程调用这个创建方法时,我们无法确保正确创建了一个实例,有时在苹果的官方例子中也是这么写的。

如果你必须使用单例,可以使用dispatch_once()

dispatch_once() 安全地解决了上面存在的问题:

(1)它保证了在块中的代码将在应用中只调用一次

(2)它是线程安全的

(3)它比使用其他方法创建单例更快,比如使用@synchronize()

@implementation Singletonstatic Singleton *shareSingleton = nil;+(Singleton*) shareInstance {    @synchronized(self){  //加锁        if (shareSingleton == nil) {            shareSingleton = [[Singleton alloc] init];          }    }    return shareSingleton;}

最佳实践

所以,创建单例的最佳实践应该是:

+(MyClass *)singleton {    static dispatch_once_t pred;    static MyClass *shared = nil;    dispatch_once(&pred, ^{        shared = [[MyClass alloc] init];    });    return shared;}

总结

在实际项目中,我们应该尽量避免过多使用单例,虽然单例不是什么魔鬼,但是能不用就不用。如果你必须使用单例,也要使用正确的方法来创建它。

转载于:https://www.cnblogs.com/YungMing/p/4346730.html

你可能感兴趣的文章
docker 数据卷管理
查看>>
如何让一个div的大小,从某一个特定值开始,随内容的增加而自动变化?
查看>>
P1977 出租车拼车(DP)
查看>>
iOS开发--完整项目
查看>>
我的博客园皮肤模板
查看>>
正则表达式
查看>>
java基础:不同进制的表现形式
查看>>
Base64转换为blob对象
查看>>
gulp自动化压缩合并、加版本号解决方案
查看>>
windows下面安装Python和pip教程
查看>>
Java 动态向 JTable 中添加数据
查看>>
平安科技移动开发二队技术周报(第九期)
查看>>
Oracle【二维表管理:约束】
查看>>
2017-2018-1 20155307 《信息安全系统设计基础》第5周学习总结
查看>>
微软职位内部推荐-Principal Dev Manager for Windows Phone Apps
查看>>
jquery改变元素属性值(转)
查看>>
《额尔古纳河右岸》读书笔记
查看>>
C#Virtual和Override的几种组合
查看>>
JavaScript总结之DOM基本操作(三)
查看>>
为Vmware硬盘减肥瘦身
查看>>