前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发-单例模式(ARC与MRC)

iOS开发-单例模式(ARC与MRC)

作者头像
孙寅
发布2020-06-02 22:45:04
4940
发布2020-06-02 22:45:04
举报
文章被收录于专栏:宜达数字宜达数字

单例一般作为工具类 单例命名:一般情况下如果一个类是单例,那么就会提供一个类方法用于快速创建单例对象 而且这个类方法的名称是有一定的规则:share + 类名称 / default + 类名称 ARC(自动引用计数模式) ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/642887-5218c39a7d979d20.png? imageMogr2/auto-orient/strip%7CimageView2/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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档