IOS開發之dispatch_once建立單例

來源:互聯網
上載者:User
單例是一種類,該類只能在第一次用的時候執行個體化一個對象,後期直接調用此對象(有點共用的意思)。在Foundation架構中比如NSFileManger和NSNotificationCenter,分別通過它們的類方法defaultManager和defaultCenter擷取。儘管不是嚴格意義的單例,這些類方法返回一個可以在應用的所有代碼中訪問到的類的共用執行個體。使用Objective-C實現單例模式的最佳方式向來有很多爭論,開發人員似乎每幾年就會改變他們的想法。他們也引入了一個很適合用於實現單例模式的函數。
 該函數就是dispatch_once:

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

 該函數接收一個dispatch_once用於檢查該代碼塊是否已經被調度的謂詞(是一個長整型,實際上作為BOOL使用)。它還接收一個希望在應用的生命週期內僅被調度一次的代碼塊,對於本例就用於shared執行個體的執行個體化。dispatch_once不僅意味著代碼僅會被運行一次,而且還是安全執行緒的,這就意味著你不需要使用諸如@synchronized之類的來防止使用多個線程或者隊列時不同步的問題。
如果被多個線程調用,該函數會同步等等直至代碼塊完成。
    實際要如何使用這些呢?    好吧,假設有一個AccountManager類,你想在整個應用中訪問該類的共用執行個體。你可以按如下代碼簡單實現一個類方法:

+ (AccountManager *)sharedManager { 

    static AccountManager *sharedAccountManagerInstance = nil; 

    static dispatch_once_t predicate; 

    dispatch_once(&predicate, ^{       

          sharedAccountManagerInstance = [[self alloc] init]; 

    });


    return sharedAccountManagerInstance; 

}

這就意味著你任何時候訪問共用執行個體,需要做的僅是:

AccountManager *accountManager = [AccountManager sharedManager];

    就這些,你現在在應用中就有一個共用的執行個體,該執行個體只會被建立一次。    該方法有很多優勢: 
           1 安全執行緒           2 很好滿足靜態分析器要求           3 和自動引用計數(ARC)相容 
           4 僅需要少量代碼
     該方法的劣勢就是它仍然運行建立一個非共用的執行個體:

    AccountManager *accountManager = [[AccountManager alloc] init];

        有些時候你希望有這種行為,但如果正在想要的是僅一個執行個體被執行個體化就需要注意這點。
    相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.