利用dispatch_once創(chuàng)建單例

利用dispatch_once創(chuàng)建單例

  • 無論是愛還是恨,你都需要單例。

  • 實際上每個iOS或Mac OS應(yīng)用都至少會有UIApplication或NSApplication.

  • ** 什么是單例呢?Wikipedia是如此定義的:**

  • 在軟件工程中,單例是一種用于實現(xiàn)單例的數(shù)學(xué)概念,即將類的實例化限制成僅一個對象的設(shè)計模式。

  • 或者我的理解是:單例是一種類,該類只能實例化一個對象。

  • 盡管這是單例的實際定義,但在Foundation框架中不一定是這樣。比如NSFileManger和NSNotificationCenter,分別通過它們的類方法defaultManager和defaultCenter獲取。盡管不是嚴(yán)格意義的單例,這些類方法返回一個可以在應(yīng)用的所有代碼中訪問到的類的共享實例。
  • 使用Objective-C實現(xiàn)單例模式的最佳方式向來有很多爭論,開發(fā)者(包括Apple在內(nèi))似乎每幾年就會改變他們的想法。當(dāng)Apple引入了Grand Central Dispatch (GCD)(Mac OS 10.6和iOS4.0),他們也引入了一個很適合用于實現(xiàn)單例模式的函數(shù)。
    該函數(shù)就是dispatch_once:
void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);
  • 該函數(shù)接收一個dispatch_once用于檢查該代碼塊是否已經(jīng)被調(diào)度的謂詞(是一個長整型,實際上作為BOOL使用)。它還接收一個希望在應(yīng)用的生命周期內(nèi)僅被調(diào)度一次的代碼塊,對于本例就用于shared實例的實例化。

  • dispatch_once不僅意味著代碼僅會被運行一次,而且還是線程安全的,這就意味著你不需要使用諸如@synchronized之類的來防止使用多個線程或者隊列時不同步的問題。

  • Apple的GCD Documentation證實了這一點:

    • 如果被多個線程調(diào)用,該函數(shù)會同步等等直至代碼塊完成。
  • 實際要如何使用這些呢?下面示例代碼

//好吧,假設(shè)有一個AccountManager類,你想在整個應(yīng)用中訪問該類的共享實例。你可以按如下代碼簡單實現(xiàn)一個類方法:
+ (AccountManager *)sharedManager { 
    static AccountManager *sharedAccountManagerInstance = nil; 

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

    return sharedAccountManagerInstance; 

}
    這就意味著你任何時候訪問共享實例,需要做的僅是:
AccountManager *accountManager = [AccountManager sharedManager];
    就這些,你現(xiàn)在在應(yīng)用中就有一個共享的實例,該實例只會被創(chuàng)建一次。
    該方法有很多優(yōu)勢: 
           1 線程安全
           2 很好滿足靜態(tài)分析器要求
           3 僅需要少量代碼
    該方法的劣勢就是它仍然運行創(chuàng)建一個非共享的實例:
AccountManager *accountManager = [[AccountManager alloc] init];
    有些時候你希望有這種行為,但如果正在想要的是僅一個實例被實例化就需要注意這點。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容