单例

和其它语言的单例产不多,可以说是最简单的一种设计模式了。但是有几个点需要注意下,单例就是一个类只有一个实例。

所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private。但是OC中的函数并没有限定符,所以我们需要用一些小技巧来屏蔽这一点。

应用场景

类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法。

这个唯一的实例只能通过类的子类化进行扩展,而且扩展的对象不会破坏客户端代码。

注意

1.OC中单例的实例变量要定义在.m文件

2.OC中单例需要重载allocWithZone:和copyWithZone:方法来防止创建别的实例。

3.单例创建要注意线程安全,不然就可能出现多个实例。

注意问题将会在Demo中讲解

Demo

首先先来看一个最常规,的不严谨的单例实现:

@implementation Singletonstatic Singleton *sharedInstance;-(Singleton *)sharedInstance
{if(sharedInstance){sharedInstance = [Singleton new];}return sharedInstance;
}@end

这看似好像是可以得到单例对象了,但是这可以说是单例的一种变形。绝不能说这就是单例,因为我们可以轻松地通过其他方式来创建对象。

所以我们还要我修改allocWithZone:和copyWithZone:方法(alloc 和 copy 方法实际上就是调用这两个方法)

-(id)copyWithZone:(NSZone *)zone
{return [[self class] sharedInstance];
}+(id)allocWithZone:(struct _NSZone *)zone
{return [self sharedInstance];
}

可是这就出现另一个问题,在sharedInstance方法里面我们实际调用过allocWithZone:(new 调用 alloc),但是它的alloc被我们重写了,这就会出现错误。所以我们需要修改sharedInstance方法

+(Singleton *)sharedInstance
{if(sharedInstance){sharedInstance = [[super allocWithZone:NULL] init];}return sharedInstance;
}

这样就可以顺利的返回单例了,而且无法通过其它方式产生实例对象。

看似完美了实际还会有问题出现,因为现在是非线程安全的,可能存在同一时间创建多个实例的情况,所以修改如下

+(instancetype)sharedInstance
{static dispatch_once_t once;dispatch_once(&once, ^{sharedInstance = [[super allocWithZone:NULL] init];});return sharedInstance;
}

客户端代码如下:

        Singleton *singleton = [Singleton sharedInstance];Singleton *singleton2 = [[Singleton alloc] init];Singleton *singleton3 = [singleton copy];[singleton print];[singleton2 print];[singleton3 print];

输出结果:

2015-07-21 21:10:32.797 Singleton[42537:10347987] 0x7fff5fbff7a8
2015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a8
2015-07-21 21:10:32.798 Singleton[42537:10347987] 0x7fff5fbff7a8

可以看到内存都指向了同一地址。

转载于:https://www.cnblogs.com/pb89/p/4708785.html

Objective-C设计模式——单例Singleton(对象创建)相关推荐

  1. 设计模式--单例(Singleton)模式

    模式意图 保证一个类只用一个实例,并且提供一个全局访问点 类图 应用场景 1.需要更严格地控制全局变量时,使用单例模式: 2.重量级的对象如线程池对象,数据库连接池对象,不需要多个实例的对象如工具类等 ...

  2. 设计模式学习笔记——单例(Singleton)模式

    设计模式学习笔记--单例(Singleton)模式 @(设计模式)[设计模式, 单例模式, Singleton, 懒汉式, 饿汉式] 设计模式学习笔记单例Singleton模式 基本介绍 单例案例 类 ...

  3. Ruby设计模式透析之 —— 单例(Singleton)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8868758 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  4. 23种设计模式 单例 (整理摘抄优秀的博文) 记住

    https://github.com/yzmaodeng/java-keypointknowledge/commit/0894a14b03b724cd362f466e8f20514efbc164aa ...

  5. JAVA设计模式 - 单例与工厂模式

    前言 设计模式是在前人总结下 , 得出的经验, 设计模式的本质是面向对象设计原则的实际运用,是对类的封装性.继承性和多态性以及类的关联关系和组合关系的充分理解, 接着我们来看设计模式中的两种比较重要的 ...

  6. 以下哪个选项不是单例模式的优点_设计模式--单例

    概述 单例模式(SingletonPattern),保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式有 3 个特点: 单例类只有一个实例对象: 该单例对象必须由单例类自行创建: 单例类 ...

  7. 跨应用程序域(AppDomain)的单例(Singleton)实现

    转载自: 跨应用程序域(AppDomain)的单例(Singleton)实现 - CorePlex代码库 - CorePlex官方网站,Visual Studio插件,代码大全,代码仓库,代码整理,分 ...

  8. Java设计模式—单例设计模式(Singleton Pattern)完全解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

  9. java设计模式 单例_java设计模式一(单例模式singleton)

    1 概述 如果要保证系统里一个类最多只能存在一个实例时,我们就需要单例模式.这种情况在我们应用中经常碰到,例如缓存池.数据库连接池.线程池.一些应用服务实例等.在多线程环境中为了保证实例的唯一性其实并 ...

最新文章

  1. [JS] 题解:提取不重复的整数
  2. LAMP一体环境快速安装
  3. [HNOI2008]遥远的行星
  4. Slog42_支配vue框架初阶项目之博客网站-单页-默认头像的布局和定位
  5. mysqldump 忽略视图_mysqldump的使用--解决不能导出视图的问题
  6. springmvc二十三:日期格式化
  7. oracle基表恢复,查找V$PARAMETER 基表 – 专业Oracle数据库恢复,或许是您恢复数据的最后机会@phone:13429648788 - 专业Oracle数据库恢复技术支持...
  8. 修改XMAPP中MYSQL的字符编码
  9. python布局管理数据_利用python创建窗口-布局管理器(五)
  10. Cisco 3550配置DHCP实例
  11. Android学习笔记之AndroidManifest.xml文件解析(摘自皮狼的博客)
  12. Autodesk BIM 360将基础设施建模也推向云端
  13. CICD详解(九)——gitlab简单使用
  14. 在边缘计算大热的背景下,为何Akamai敢说自己就是边缘
  15. 通过Powershell重新挂接父VHD磁盘的方法
  16. 算法:回溯十一 Subsets数组的子数组集合4种解法
  17. c语言dda算法完整实现,计算机图形学DDA算法.doc
  18. 利用opencv与python3 JPEG压缩与解压实现
  19. 移动开发技术的进化历程(原生开发与跨平台技术)
  20. printf 打印结构体成员函数出错原因分析

热门文章

  1. C#通过接口与线程通信(捕获线程状态)介绍
  2. ibatis 中 $与#的区别
  3. hdu 1892【二维树状数组】
  4. 在服务器端生成Excel文件然后从服务器下载的本地的代码
  5. caffe路径正确,却读不到图片
  6. 多个摄像机之间的切换
  7. 洛谷P4841 城市规划(多项式求逆)
  8. 创业-程序员独自5大思维障碍
  9. 【Python】list和tuple 区别比较
  10. python 学习资源收集汇总