利用dispatch_once創建單例

單例模式是在實際項目開發中用到比較多的一種設計模式,設計原理是整個系統只產生一個對象實例,通過一個統一的方法對外提供這個實例給外部使用。

1 ) 

@implementation Car
//聲明一個靜態對象引用並賦爲nil
static Car *sharedInstance= nil;

//聲明類方法(+爲類方法,也就是Java中的靜態方法)
+(Car *) sharedInstance
{
     if(!sharedInstance)
     {
          sharedInstance = [[self alloc] init];
     }
     return sharedInstance;
}
@end


//覆蓋allocWithZone:方法可以防止任何類創建第二個實例。使用synchronized()可以防止多個線程同時執行該段代碼(線程鎖)


+(id)allocWithZone:(NSZone *) zone
{
     @synchronized(self)
     {
          if(sharedInstance == nil)
          {
               sharedInstance = [super allocWithZone:zone];
               return sharedInstance;
          }
     }
     return sharedInstance;
}



2 ) 自蘋果引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0)後,創建單例又有了新的方法,那就是使用dispatch_once函數。

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一個參數predicate,該參數是檢查後面第二個參數所代表的代碼塊是否被調用的謂詞,第二個參數則是在整個應用程序中只會被調用一次的代碼塊。

 接下來我們來實現自己的單例,這裏有一個SchoolManager類,爲這個類實現單例

  1. +(SchoolManager *)sharedInstance  
  2. {  
  3.     static SchoolManager *sharedManager;  
  4.       
  5.     static dispatch_once_t onceToken;  
  6.     dispatch_once(&onceToken, ^{  
  7.         sharedManager = [[SchoolManager alloc] init];  
  8.     });  
  9.       
  10.     return sharedManager;  
  11. }  
到目前爲止,我們就實現了一個單例,一切就搞定了,是不是很簡單!

使用就按照如下方式獲取唯一實例即可:

  1. SchoolManager *schoolManager = [SchoolManager sharedInstance];  


發佈了21 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章