单例

单例模式是iOS经常使用设计模式中的一种。单例设计模式的做用是使得这个类的一个对象成为 系统中的惟一实例,所以须要用一种惟一的方法去建立这个对象并返回这个对象的地址。那么,咱们什么时候使用单例模式呢?一、类只能有一个实例,并且必须从一个 为人熟知的访问点对其访问。二、这个惟一的实例只能经过子类化进行扩展,并且扩展的对象不会破坏客户端代码。程序员

那么用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)post

 

 

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

  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类变得“严格”了。设计

相关文章
相关标签/搜索