单例一般作为工具类 单例命名:一般情况下如果一个类是单例,那么就会提供一个类方法用于快速创建单例对象 而且这个类方法的名称是有一定的规则:share 类名称 / default 类名称 ARC(自动引用计数模式) ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/642887-5218c39a7d979d20.png? imageMogr2/auto-orient/strip|imageView2/2/w/1240)
Paste_Image.png
实现下面这两个方法前提遵守(NSCopying, NSMutableCopying)
Paste_Image.png
MRC 这个里面就必须注意retainCount release等操作 因为单例是全局只有一份,一旦release,计数器变为0,那么再去创建单例对象就会造成坏内存访问。
Paste_Image.png
这里其实还可以对引用计数器做一步操作,也就是实现这一步,你肯定是开发经验充足的程序员,不实现也不会有什么后果
Paste_Image.png
因为打印系统的一些单例对象的计数器会发现打印出来数值会很大,所以我们创建出来的单例实现上述方法,比格自然就提升上去了。(注:返回的数值可以自己填写,也可以MaxFloat)
虽然上面的单例代码已经解决了单例问题,但是复用性特别不好,我们需要可以很方便的在ARC或者MRC下进行开发的单例模式
Paste_Image.png
我们可以在else的里面把MRC的代码写进去。 这样系统就会根据开发环境来判断
一些情况下:我们经常用到单例这个类,但是这里面后续会写很多方法,所以我们会搞很多子类,子类里面有网络、工具类的单例,所以子类按照逻辑也要实现单例。
那么问题就来了: 1、一个单例子类(例如:son)创建对象调用alloc方法 2、会通过allocWithZone创建一个全局单例对象 3、这一个创建出来的全局单例默认就是子类的类型(son) 4、创建父类对象,也是通过alloc方法,因为单例只有一个,所以谁先调用,整个子父类创建出来的类型就是优先创建的单例对象类型
所以避免出错,对子类修改,尽量不要继承单例类。我们需要重写一遍单例代码。
到了这里就需要很深的功底:我们一般使用宏来延生单例扩展性 因为单例类里面的单例创建代码都是一样的。
代码语言:javascript复制#define interfaceSingle (instancetype)shareTool
// 这两句代码是一样的,下面可以通过你传入的名字来显示创建的单例是什么(name)类型
代码语言:javascript复制#define interfaceSingle(name) (instancetype)share##name
同理也可以实现方法实现里面的。
粘贴一段,后面的是为了链接代码在编译过程中被识别,一定要这么做!
Paste_Image.png