单件实例

Foundation和Application Kit框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManagerNSWorkspace类在使用时都是基于进程进行单件对象的实例化。当您向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。

单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果您的类在概念上只有一个实例(比如NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。

创建单件实例时,您需要在代码中执行下面的工作:

  • 声明一个单件对象的静态实例,并初始化为nil

  • 在该类的类工厂方法(名称类似于“sharedInstance”或“sharedManager”)中生成该类的一个实例,但仅当静态实例为nil的时候。

  • 重载allocWithZone:方法,确保当用户试图直接(而不是通过类工厂方法)分配或初始化类的实例时,不会分配出另一个对象。

  • 实现基本协议方法:copyWithZone:releaseretainretainCount、和autorelease ,以保证单件的状态。

列表2-15 显示如何实现一个单件:

[cpp]  view plain copy
  1. <span xmlns="http://www.w3.org/1999/xhtml" style="">static MyGizmoClass *sharedGizmoManager = nil;  
  2.   
  3.    
  4.   
  5. + (MyGizmoClass*)sharedManager  
  6.   
  7. {  
  8.   
  9.     @synchronized(self) {  
  10.   
  11.         if (sharedGizmoManager == nil) {  
  12.   
  13.             [[self alloc] init]; // assignment not done here  
  14.   
  15.         }  
  16.   
  17.     }  
  18.   
  19.     return sharedGizmoManager;  
  20.   
  21. }  
  22.   
  23.    
  24.   
  25. + (id)allocWithZone:(NSZone *)zone  
  26.   
  27. {  
  28.   
  29.     @synchronized(self) {  
  30.   
  31.         if (sharedGizmoManager == nil) {  
  32.   
  33.             sharedGizmoManager = [super allocWithZone:zone];  
  34.   
  35.             return sharedGizmoManager;  // assignment and return on first allocation  
  36.   
  37.         }  
  38.   
  39.     }  
  40.   
  41.     return nil; //on subsequent allocation attempts return nil  
  42.   
  43. }  
  44.   
  45.    
  46.   
  47. - (id)copyWithZone:(NSZone *)zone  
  48.   
  49. {  
  50.   
  51.     return self;  
  52.   
  53. }  
  54.   
  55.    
  56.   
  57. - (id)retain  
  58.   
  59. {  
  60.   
  61.     return self;  
  62.   
  63. }  
  64.   
  65.    
  66.   
  67. - (unsigned)retainCount  
  68.   
  69. {  
  70.   
  71.     return UINT_MAX;  //denotes an object that cannot be released  
  72.   
  73. }  
  74.   
  75.    
  76.   
  77. - (void)release  
  78.   
  79. {  
  80.   
  81.     //do nothing  
  82.   
  83. }  
  84.   
  85.    
  86.   
  87. - (id)autorelease  
  88.   
  89. {  
  90.   
  91.     return self;  
  92.   
  93. }</span>  

当您需要一个单件实例(由类工厂方法来创建和控制),又需要通过分配和初始化创建其它实例时,就可能出现问题。在这种情况下,您不必重载allocWithZone: 及其后的其它方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值