單例

單例模式是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類變得「嚴格」了。設計

相關文章
相關標籤/搜索