iOS设计模式之单例模式

news/2024/7/20 15:13:23 标签: 设计模式, 移动开发, 内存管理

单例模式是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类变得“严格”了。

相关文章:

Object-C 中实现 Singleton (单例) 模式


http://www.niftyadmin.cn/n/846158.html

相关文章

EBS创建相应的用户

登陆EBS,依次点击"System Administrator"-->"Security"-->"User"-->"define",输入用户名及密码,选择相应的responsibility,密码策略等信息,点击上面的保存 密码要输入两次&…

(整理笔记)stm32 systick 的 研究和使用

一、SysTick定时器的概念 Sys 系统 ,tick 滴答声 ,系统滴答滴答很形象地表示了它是一个系统节拍器。SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存…

iTOP4412|Android-5.1.1_r9 HWC

0 前言 更新中,敬请期待。。。 参考资料

初探Docker

本文旨在让大家了解什么是Docker,并带领大家体验Docker使用的整个流程。 开启Docker学习之旅前,我们简单描述几个场景,应该很多人都有碰到过: 小凹同学开发了一个web应用,服务器环境是: centos 7 nginx node4.6 mon…

linux系统ioctl使用示例

*************************************程序4************************************** #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <sys/soundcard.h> #include <stdio.h> #inclu…

FFMPEG 库移植到 VC 需要的步骤

2019独角兽企业重金招聘Python工程师标准>>> 在VC下使用FFMPEG编译好的库&#xff0c;不仅仅是把.h&#xff0c;.lib&#xff0c;.dll拷贝到工程中就行了&#xff0c;还需要做以下几步。&#xff08;此方法适用于自己使用MinGW编译的库&#xff0c;也同样适用于从网…

关于MySql链接url参数的设置

jdbc.driverClassNamecom.mysql.jdbc.Driverjdbc.urljdbc:mysql://localhost:3306/database?useUnicodetrue&characterEncodingutf8&autoReconnecttrue&rewriteBatchedStatementsTRUEjdbc.usernamerootjdbc.passwordpassword 特别说明其中的jdbc.url配置&#xff…

jQuery 学习笔记

2019独角兽企业重金招聘Python工程师标准>>> 本文存下来作为备忘。 1,更改css样式四种情况&#xff1a; A&#xff0c;$(“p”).(“background-color”,”red”); B&#xff0c;var nome { background:’red’, margin:’10px 0 0’ }; $(“p”).css(nome); C&a…