前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS开发之单例模式你用对了吗

iOS开发之单例模式你用对了吗

作者头像
roc
发布2018-08-01 09:54:47
3570
发布2018-08-01 09:54:47
举报
文章被收录于专栏:iOS开发笔记iOS开发笔记

、 单例在iOS开发中可以说是很常见的一种设计模式,在你的项目中或许你已经用过很多次,大家可能都会想不就是单例吗,我闭着眼睛单手就能写。是的,单例可以说是所有设计模式中相对简单的一种设计模式。逻辑清晰,代码简单。但在项目中单例你真的用对了吗?

想到这个问题的时候,我在网上搜了搜,基本上网上所有单例的写法如下:

或许你会问单例不就是这么写的吗?是的网上的这种写法是没有任何问题的。也许只是在你自己的项目中是没有任何问题的,试想一下这个场景你要为别人提供服务、封装SDK提供了一个单例类,你当然是希望别人通过你提供的创建单例的方法来创建类,但是谁又能确定别人会怎么写呢,如果别人不用你提供的创建单例的方法,而是直接通过alloc、init创建类,会出现什么情况呢?我们来验证一下

看到这里先别急着往下看,可以思考一下控制台的输出是什么?三个对象会是同一个地址吗?

是的,很明显三个对象的地址是不一样的,这就和单例模式相违背了。通过alloc、init开辟了新的内存空间,那么这种情况能不能避免呢?答案是肯定的。

为了防止别人不小心利用alloc/init方式创建示例,也为了防止别人故意为之,我们要保证不管用什么方式创建都只能是同一个实例对象,这就得在SingleClass中重写另一个方法,实现如下:

运行一下看下结果:

显然创建的三个对象都是在同一个内存地址。这就结束了?然而并没有,我们接着这个思路往下走。我们在使用类的时候,类中肯定会有一些属性。如果加入属性的时候会是什么结果呢?在SingleClass类中加入下列代码:

输出一下:

地址是一样的。

注意:

以上代码均是使用ARC的方式管理内存,如果你还在使用MRC。那你还需要重写 retain 和release方法,防止示例引用计数的改变。

代码已经提交GitHub,地址如下:https://github.com/Arronee/SingleClass,如有不正确之处,欢迎指正~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS开发笔记 微信公众号,前往查看

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

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

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