博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS设计模式之单例模式
阅读量:6434 次
发布时间:2019-06-23

本文共 1413 字,大约阅读时间需要 4 分钟。

单例模式是iOS常用设计模式中的一种。单例设计模式的作用是使得这个类的一个对象成为系统中的唯一实例,因此需要用一种唯一的方法去创建这个对象并返回这个对象的地址。那么,我们何时使用单例模式呢?1、类只能有一个实例,而且必须从一个为人熟知的访问点对其访问。2、这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

那么用Objective-C如何实现单例模式呢?下面我们来新建一个Singleton类,在Singleton.h中实现如下

 

  1. @interface Singleton : NSObject  
  2.   
  3. + (Singleton *) sharedInstance;  
  4.   
  5. @end  

 

 

在Singleton.m

  1. @implementation Singleton  
  2.   
  3. static Singleton * sharedSingleton = nil;  
  4.   
  5. + (Singleton *) sharedInstance  
  6. {  
  7.     if (sharedSingleton == nil) {  
  8.         sharedSingleton = [[Singleton alloc] init];  
  9.     }  
  10.     return sharedSingleton;  
  11. }  
  12.   
  13. @end  

这样就创建一个简单的单例模式,实际上有一部分程序员也是这样实现的,但实际上这是一个不“严格”版本,在实际中使用,可能会遇到发起调用的对象不能以其他分配方式实例化单例对象,否则,就会创建多个实例。(之前有人和我讨论过这个问题,说使用者应该严格按照接口来使用,当实际上Singleton是一个对象,我们不能保证使用者不会使用其他的方法去创建(比如alloc),这个时候他就会创建多个实例,这样就会出现这些无法感知的bug)

 

 

下面我对Singleton.m的进行改进

  1. @implementation Singleton  
  2.   
  3. static Singleton * sharedSingleton = nil;  
  4.   
  5. + (Singleton *) sharedInstance  
  6. {  
  7.     if (sharedSingleton == nil) {  
  8.         sharedSingleton = [[super allocWithZone:NULL] init];  
  9.     }  
  10.     return sharedSingleton;  
  11. }  
  12.   
  13. + (id) allocWithZone:(struct _NSZone *)zone  
  14. {  
  15.     return [[self sharedInstance] retain];  
  16. }  
  17.   
  18. - (id) copyWithZone:(NSZone *) zone  
  19. {  
  20.     return self;  
  21. }  
  22.   
  23. - (id) retain  
  24. {  
  25.     return self;  
  26. }  
  27.   
  28. - (NSUInteger) retainCount  
  29. {  
  30.     return NSUIntegerMax;  
  31. }  
  32.   
  33.   
  34. - (void) release  
  35. {  
  36.     //  
  37. }  
  38.   
  39. - (id) autorelease  
  40. {  
  41.     return self;  
  42. }  
  43.   
  44. @end  

也许你注意到了,我重载了allocWithZone:,保持了从sharedInstance方法返回的单例对象,使用者哪怕使用alloc时也会返回唯一的实例(alloc方法中会先调用allocWithZone:创建对象)。而retain等内存管理的函数也被重载了,这样做让我们有了把Singleton类变得“严格”了。

相关文章:

转载地址:http://ntqga.baihongyu.com/

你可能感兴趣的文章
Hadoop学习:Map/Reduce初探与小Demo实现
查看>>
【Lucene4.8教程之二】索引
查看>>
稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记。
查看>>
数据归一化、标准化
查看>>
Java开发中JDBC连接数据库代码和步骤
查看>>
php验证码--图片
查看>>
Java代码质量监控工具Sonar安装
查看>>
SpringMVC中 -- @RequestMapping的作用及用法
查看>>
Linux之convert命令【转】
查看>>
提高阅读源代码的效率 转
查看>>
java一些常用并发工具示例
查看>>
45. Jump Game II
查看>>
c++ 类内static成员初始化
查看>>
python-ConfigParser模块【读写配置文件】
查看>>
更改printk打印级别【转】
查看>>
2.2 dubbo-spi源码解析
查看>>
hadoop之 YARN配置参数剖析—RM与NM相关参数
查看>>
软件开发中的几种数据交换协议
查看>>
MySQL多个相同结构的表查询并把结果合并放在一起的语句(union all)
查看>>
Xilinx下载方式(具体可以参考配置MCS文件时右下角help调出的doc)
查看>>