ios中的執行緒安全單例實現

管振緯發表於2013-11-18

我們這裡重點討論的是執行緒安全,而不是單例的嚴格實現(若需要嚴格實現還需要複寫一些方法,更改一些實現程式碼):

gcd實現:

  static AccountManager *sharedAccountManagerInstance = nil; 

+ (AccountManager *)sharedManager { 

    static dispatch_once_t predicate; dispatch_once(&predicate, ^{       
          sharedAccountManagerInstance = [[AccountManager alloc] init]; 
    });

    return sharedAccountManagerInstance; 

}

利用系統提供的能力來實現,此處保證^{       
          sharedAccountManagerInstance = [[self alloc] init]; 
    });在應用程式的生命週期裡只被執行一次;若sharedAccountManagerInstance被外面被手動釋放(arc下無法手動release不存在此問題),則會造成崩潰,崩潰原因時野指標訪問,系統錯誤碼應為exc_bad_access.因此呼叫獲取單例物件者是不應該釋放該單例物件的,這點需要嚴格遵守,單例本身的設計思想也包含了這一點。

雙檢鎖實現:增加的外圍檢查用來提高效率。

static AccountManager *sharedAccountManagerInstance = nil; 

+ (AccountManager *)sharedManager


   if(sharedAccountManagerInstance == nil)

{

  @synchronized (self){
        if (sharedAccountManagerInstance == nil) 
        {
            sharedAccountManagerInstance = [[AccountManager alloc] init];
        }
    }

}

    return sharedAccountManagerInstance; 

}


相關文章