一、草草写法
先附上不大部分人的写法
SingleModel.h
![](https://img.haomeiwen.com/i6523222/4b9567ffe519ec9f.png)
SingleModel.m
![](https://img.haomeiwen.com/i6523222/0550aead33e68f1b.png)
测试代码:
![](https://img.haomeiwen.com/i6523222/3b1f2df1dcbf63b4.png)
打印结果:
![](https://img.haomeiwen.com/i6523222/89f7619b9e232ded.png)
通过上边的测试,可以看出来通过alloc创建对象时,是有问题的,所以要封锁初始化的方法
如alloc, copy,mutableCopy,new
原理:
创建对象的步骤分为申请内存(alloc)、初始化(init)这两个步骤,我们要确保对象的唯一性,因此在第一步这个阶段我们就要拦截它。当我们调用alloc方法时,OC内部会调用allocWithZone这个方法来申请内存,我们覆写这个方法,然后在这个方法中调用shareInstance方法返回单例对象,这样就可以达到我们的目的。拷贝对象也是同样的原理,覆写copyWithZone方法,然后在这个方法中调用shareInstance方法返回单例对象
二 、正确写法
![](https://img.haomeiwen.com/i6523222/3fb90f720152d949.png)
1、shareInstance单例方法中,变量的初始化改成[[super allocWithZone:NULL] init]
2、实现copyWithZone:和mutableCopyWithZone:方法
测试代码:
![](https://img.haomeiwen.com/i6523222/3bb5ea0e8bb5afdc.png)
打印结果:
![](https://img.haomeiwen.com/i6523222/67a0ca41b2bdc9db.png)
无论通过哪种方式创建出来的实例对象,其内存地址都是一样的,所以该种写法才是严谨的。
网友评论