例模式顾名思义就是只有一个实例,它确保一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。它经常用来做应用程序级别的共享资源控制。这个模式使用频率非常高,通过一个单例类,可以实现在不同窗口之间传递数据




在objective-c中要实现一个单例类,至少需要做以下四个步骤:

1、为单例对象实现一个静态实例,并初始化,然后设置成nil,

2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,

3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,

4、适当实现allocWitheZone,copyWithZone,release和autorelease,retain方法


如果你准备写一个类,希望保证只有一个实例存在,同时可以得到这个特定实例提供服务的入口,那么可以使用单态设计模式。单态模式在Java、C++中很常用,在Cocoa里,也可以实现。

由于自己设计单态模式存在一定风险,主要是考虑到可能在多线程情况下会出现的问题,因此苹果官方建议使用以下方式来实现单态模式:




  1. static MyGizmoClass*sharedGizmoManager = nil;//static 静态实例是关键  
  2.    
  3. + (MyGizmoClass*)sharedManager  
  4. {  
  5.     @synchronized(self){  
  6.         if(sharedGizmoManager == nil) {  
  7.             [[selfalloc] init];// assignment not done here  
  8.         }  
  9.     }  
  10.     return sharedGizmoManager;  
  11. }  
  12.    
  13. + (id)allocWithZone:(NSZone*)zone  
  14. {  
  15.     @synchronized(self){  
  16.         if(sharedGizmoManager == nil) {  
  17.             sharedGizmoManager = [super allocWithZone:zone];  
  18.             return sharedGizmoManager;  // assignment and return on first allocation  
  19.         }  
  20.     }  
  21.     return nil; //on subsequent allocation attempts return nil  
  22. }  
  23.    
  24. - (id)copyWithZone:(NSZone*)zone  
  25. {  
  26.     return self;  
  27. }  
  28.    
  29. - (id)retain  
  30. {  
  31.     return self;  
  32. }  
  33.    
  34. - (unsigned)retainCount  
  35. {  
  36.     return UINT_MAX;  //denotes an object that cannot be released  
  37. }  
  38.    
  39. - (void)release  
  40. {  
  41.     //do nothing  
  42. }  
  43.    
  44. - (id)autorelease  
  45. {  
  46.     return self;  
  47. }