iOS 单例以及使用中的坑

单例模式是各种开发语言中必然涉及到的一种设计模式,例如在iOS中有很多系统方法都是使用的单例,例如:[NSNotificationCenter defaultCenter]

用四人帮(GoF)教科书的说法:

Ensures a class has only one instance, and provide a global point of access to it


单例类图

iOS实现单例的方式有几种,今天重点介绍使用GCD实现单例以及在使用过程中遇到的问题


GCD方式实现单例

在单例类中定义两个属性分别是defaultValue,name;defaultValue给一个模式值,name在实例化后给赋值


step1代码实现

如我们所想,输出instance地址以及 step1 defauleValue=init defaultValue,name=step1 name


step1代码输出结果

接下来我们进入到第二步的测试,将instance置为nil,然后再重新实例化instance,看输入的内存地址以及属性值


step2代码实现

step2步骤的输出可能会出乎我们的想象,直接看结果


step2代码输出结果

和你想的是否一样呢?

按照正常的一个认知,将实例对象instance置为nil后,重新实例化后,应该是一个新的对象;但是从运行结果可以看出(见图中红色圈中内容),重新实例化后与初次实例化后的地址是一样的,也就是指向了同一块内存地址,所以属性输出内容与第一次完全一样(见图中绿色下划线内容)

那么是什么原因造成的呢?进入到dispatch_once的源码实现中去探究下


dispatch_once源码

注意dispatch_once源码中的红线部分,dispatch_once_t *predicate;  dispatch_once_t又是什么呢?继续看源码


dispatch_once_t源码

通过源码我们可以清晰的知道,dispatch_once_t是一个long类型的变量,初始化必须为0;

至此,我们可以清晰的了解到,dispatch_once的实现逻辑;

dispatch_once源码

通过上图可知,使用os_atomic_load来保障了多线程操作时的原子性

dispatch_once主要是根据long类型的值决定怎么去执行代码(所以dispatch_once_t需要声明为static,保证全局只有1个)

当值为0时,执行dispatch_once的block代码

当值为-1时,跳过dispatch_once的block代码

当值为其他值时,线程被阻塞,等待其值改变;

当dispach_once的block执行完成后,将long类型的值设置为-1.其他线程不在阻塞,跳过block。下周再调用shareInstance的时候,block已经为-1。直接跳过block。


线程实现观察onceToken的值


运行结果


了解了dispatch_once的实现原理后,也就了解了文章开头中将实例instance=ni后,再次实例化后,得到的还是同样的结果,那么应该如何修改呢?

关键就在与onceToken的值,添加一个方法,将onceToken置为0


单例完整实现


step3代码实现


step3输出结果



代码实现地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,904评论 1 32
  • ***********单例************************************** http:...
    树懒啊树懒阅读 3,785评论 0 2
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类...
    司马DE晴空阅读 5,176评论 0 7
  • 一:base.h 二:block.h 1. dispatch_block_flags:DISPATCH_BLOCK...
    小暖风阅读 7,550评论 0 0
  • 盛夏,你的离开,我的期待 思念如丝缠绕 时紧时松 不同城市的距离 阻碍着即时的沟通 你忙我闲 你闲我忙 不同频率上...
    我爱喵阅读 1,531评论 0 0

友情链接更多精彩内容