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

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

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

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

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

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

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

运行一下看下结果:

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

输出一下:

地址是一样的。

注意:

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

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

原文发布于微信公众号 - iOS开发笔记(roclel)

原文发表时间:2018-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码生

Linux 权限代码解析

首先说明: 数字后面为9位由字母或-组成的 每三位对应前面的一个数字 例如:755 rwx 对应第一个7 r-x 对应第二个5 r-x 对应第三个5

1864
来自专栏Python中文社区

用Python实现微信接口(一)

專 欄 ❈爱撒谎的男孩,Python中文社区专栏作者 博客:https://chenjiabing666.github.io ❈ 安装 sudo pip in...

4286
来自专栏idba

获取没有设置TTL的key

在运维Redis的时候,总会遇到使用不规范的业务设计,比如没有对key设置ttl,进而导致内存空间吃紧,通常的解决方法是在slave上dump 出来所有的k...

922
来自专栏友弟技术工作室

bash及其特性

1273
来自专栏FreeBuf

Node.js中的内存泄漏分析

内存泄漏(Memory Leak)指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。如果内存泄漏的位置比较关键,那么随着处理的进行可能持有越来越多的无用...

4685
来自专栏程序员互动联盟

vim带你装逼带你飞(二)

上篇我贴上了我使用的vim配置及插件配置,有这些东西只能是一个脚本堆积,无从谈高效的代码阅读开发。 下面我们就来写经常使用的命令,就从配置F系列快捷键开始吧。 ...

2916
来自专栏Laoqi's Linux运维专列

python3–文件操作

49410
来自专栏Python

linux每日命令(17):which命令

我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:

1404
来自专栏跟着阿笨一起玩NET

jquery调用页面的方法

本文转载:http://www.cnblogs.com/chenxizhang/archive/2009/05/28/1491250.html

2442
来自专栏用户2442861的专栏

JavaWeb工程中web.xml基本配置

        先说下我记得xml规则,必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对。

1741

扫码关注云+社区

领取腾讯云代金券