iOS單例模式(二)

單例是一種類,該類只能在第一次用的時候實例化一個對象,后期直接調用此對象(有點共享的意思)。

在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];

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、OC中創建線程的方法是什么?如果指定在主線程中執行代碼?如何延時執行代碼。【難度系數★★】 1)創建線程的方法...
    木旁_G閱讀 1,993評論 2 16
  • 一、單例是什么?(apl??ke??(?)n 申請) 在 Foundation 和 Application Kit...
    茉上心弦閱讀 6,108評論 6 22
  • 單例模式(SingletonPattern)一般被認為是最簡單、最易理解的設計模式,也因為它的簡潔易懂,是項目中最...
    成熱了閱讀 4,293評論 4 34
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,211評論 30 472
  • 圖書館自習室座位有限,晚到的人很難找到空位。孫呈往往是最早到的人之一,他愛坐在靠窗的從前往后數第六張桌子,習慣性地...
    豐城劍回閱讀 576評論 17 18