iOS设计模式——单例模式

转载 2016年06月02日 10:05:58

单例模式用于当一个类只能有一个实例的时候, 通常情况下这个单例代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以控制是非常有必要的。

单例模式需要达到的目的

1. 封装一个共享的资源

2. 提供一个固定的实例创建方法

3. 提供一个标准的实例访问接口

单例模式的创建

本文以创建一个MySingletonClass的单例模式为例。首先,我们需要定义一个类MySingletonClass.

  1. @interface MySingletonClass:NSObject {  
  2.       
  3. }  

并且为其添加一个类方法(注意,这里不是实例方法)+(id)sharedInstance;一个基本的实现写法如下:

  1. static MySingletonClass *sharedCLDelegate = nil;  
  2. +(MySingletonClass *)sharedInstance{  
  3.     @synchronized(self) {  
  4.         if(sharedCLDelegate == nil) {  
  5.             [[[self class] alloc] init]; //   assignment   not   done   here  
  6.         }  
  7.     }  
  8.     return sharedCLDelegate;  
  9. }  

在上面的代码中(用到了关键字@synchronized是为了保证我们的单例的线程级别的安全,可以适用于多线程模式下。)static变量sharedCLDelegate用于存储一个单例的指针,并且强制所有对该变量的访问都必须通过类方法   +(id)sharedInstance,在对   +(id)sharedInstance第一次调用时候完成实例的创建。这里值得留意一下的是,上面代码中用的是[[selfclass] alloc],而不是 [MySingletonClass alloc],一般情况下这两种写法产生同样的效果,但是这里这样做是为了更好的利用OOP的性质,[selfclass]可以动态查找并确定类的类型从而便于实现对该类的子类化。

对实例化的控制

为了完全的实现实例的单态性,必须通过一定手段来避免实例多次被创建。+(id)sharedInstance控制了单例的创建和访问,但是并不能控制其它地方的代码通过alloc方法来创建更多的实例,因此我们还要重载任何一个涉及到allocation的方法,这些方法包括   +new, +alloc,+allocWithZone:, -copyWithZone:, 以及 -mutableCopyWithZone: 另外,+(id)sharedInstance也需要稍作修改。

  1. + (id)hiddenAlloc  
  2. {  
  3.     return [super alloc];  
  4. }  
  5.   
  6.   
  7. + (id)alloc  
  8. {  
  9.     NSLog(@"%@: use +sharedInstance instead of +alloc", [[self class] name]);  
  10.     return nil;  
  11. }  
  12.   
  13.   
  14. + (id)new  
  15. {  
  16.     return [self alloc];  
  17. }  
  18.   
  19. +(id)allocWithZone:(NSZone*)zone  
  20. {  
  21.     return [self alloc];  
  22. }  
  23.   
  24. -   (id)copyWithZone:(NSZone *)zone  
  25. {   // -copy inherited from NSObject calls -copyWithZone:  
  26.     NSLog(@"MySingletonClass: attempt to -copy may be a bug.");  
  27.     [self retain];  
  28.     return self;  
  29. }  
  30.   
  31. - (id)mutableCopyWithZone:(NSZone *)zone  
  32. {  
  33.     // -mutableCopy inherited from NSObject calls -mutableCopyWithZone:  
  34.     return [self copyWithZone:zone];  
  35. }  
  36.   
  37. +(id)sharedInstance修改如下:  
  38.   
  39. + (MySingletonClass *)sharedInstance {  
  40.     @synchronized(self) {  
  41.         if (sharedCLDelegate == nil)   {  
  42.             [[[self class] hiddenAlloc] init]; // assignment not done here  
  43.         }  
  44.     }  
  45.     return sharedCLDelegate;  
  46. }  

如果不考虑类的子类化,+hiddenAlloc这个方法可以省略。由于我们是用[selfclass]来实现类型的动态识别,用[[selfclass] hiddenAlloc]可以避免调用到被重载过的alloc方法。此外,hiddenAlloc也为可能的子类化提供了一个调用原始alloc方法的机会。上面重载过的alloc方法只是给出一个log信息并且返回nilCopying方法里只是简单的增加了retain的计数并没有返回一个新的实例。这也正体现了单例模式的性质,因为技术上来讲,拷贝一个单例是错误的(因为是单例)所以在copyWithZone方法中我们给出了一个错误信息,当然也可以扔出一个exception

单例的销毁

通常我们在   -(void)applicationWillTerminate:(UIApplication *)application方法中调用如下方法:

  1. + (void)attemptDealloc  
  2. {  
  3.     if ([sharedCLDelegate retainCount] != 1)  
  4.         return;  
  5.   
  6.     [sharedCLDelegate release];  
  7.     myInstance = nil;  
  8. }  

值得注意的是,上面这个attemptDealloc方法顾名思义,只是试图释放掉这个单例。如果retain的计数不为1,说明还有其他地方对该单例发送过retain消息。考虑到一个单例模式的生存周期是整个程序结束为止。所以,在程序的任何一个地方都没有必要向这个单例发送retain消息,即便是对这个单例有引用。而是调用sharedInstance方法来引用这个单例,这样做是安全的,也是合乎单例模式的技术含义的。

iOS中的单例模式应用

iOS中好几个类都是采用了单例模式,比如NSApplication NSFontManager,   NSDocumentController,NSHelpManager, NSNull,NSProcessInfo, NSScriptExecutionContext,   NSUserDefaults.


如果本文有任何错误之处,欢迎拍砖指正,共同进步, 谢谢!

相关文章推荐

iOS常用设计模式 —— 单例模式

iOS常用设计模式壹:单例模式 单例模式的作用是解决“应用中只有一个实例”的一类问题 1. 问题背景在一个iOS应用的生命周期中,有时候只需要某个类的一个实例,如果有多个该例,就会占用过多内存或者...

iOS设计模式——单例模式

单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统属性比如一个程序的某个引擎或是数据。用单例模式加以...

iOS 设计模式——单例模式

iOS 创建单例的两个中模式 单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。 单例模式在iOS开发中非常创建,也非常重要。...

iOS设计模式——单例模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备...

iOS设计模式——单例模式

iOS设计模式——单例模式 单例模式用于当一个类只能有一个实例的时候, 通常情况下这个“单例”代表的是某一个物理设备比如打印机,或是某种不可以有多个实例同时存在的虚拟资源或是系统...

设计模式——单例模式

  • 2011-04-16 21:55
  • 39KB
  • 下载

iOS设计模式(02):单例模式

iOS设计模式(02):单例模式 singleton-design-pattern 什么是单例模式? 单例模式是一个类在系统中只有一个实例对象。通过全局的一个入口点对这个实例对象...

设计模式——单例模式

设计模式实现——单例模式

  • 2016-09-03 19:28
  • 18.20MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)