iOS單例模式(二)

單例是一種類,該類只能在第一次用的時(shí)候?qū)嵗粋€(gè)對(duì)象,后期直接調(diào)用此對(duì)象(有點(diǎn)共享的意思)。

在Foundation框架中比如NSFileManger和NSNotificationCenter,分別通過(guò)它們的類方法defaultManager和defaultCenter獲取。盡管不是嚴(yán)格意義的單例,這些類方法返回一個(gè)可以在應(yīng)用的所有代碼中訪問(wèn)到的類的共享實(shí)例。使用Objective-C實(shí)現(xiàn)單例模式的最佳方式向來(lái)有很多爭(zhēng)論,開(kāi)發(fā)者似乎每幾年就會(huì)改變他們的想法。他們也引入了一個(gè)很適合用于實(shí)現(xiàn)單例模式的函數(shù)。

該函數(shù)就是dispatch_once:

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

該函數(shù)接收一個(gè)dispatch_once用于檢查該代碼塊是否已經(jīng)被調(diào)度的謂詞(是一個(gè)長(zhǎng)整型,實(shí)際上作為BOOL使用)。它還接收一個(gè)希望在應(yīng)用的生命周期內(nèi)僅被調(diào)度一次的代碼塊,對(duì)于本例就用于shared實(shí)例的實(shí)例化。

dispatch_once不僅意味著代碼僅會(huì)被運(yùn)行一次,而且還是線程安全的,這就意味著你不需要使用諸如@synchronized之類的來(lái)防止使用多個(gè)線程或者隊(duì)列時(shí)不同步的問(wèn)題。

如果被多個(gè)線程調(diào)用,該函數(shù)會(huì)同步等等直至代碼塊完成。

實(shí)際要如何使用這些呢?

好吧,假設(shè)有一個(gè)AccountManager類,你想在整個(gè)應(yīng)用中訪問(wèn)該類的共享實(shí)例。你可以按如下代碼簡(jiǎn)單實(shí)現(xiàn)一個(gè)類方法:

+ (AccountManager *)sharedManager {

static AccountManager *sharedAccountManagerInstance = nil;

static dispatch_once_t predicate;

dispatch_once(&predicate, ^{

sharedAccountManagerInstance = [[self alloc] init];

});

return sharedAccountManagerInstance;

}

這就意味著你任何時(shí)候訪問(wèn)共享實(shí)例,需要做的僅是:

AccountManager *accountManager = [AccountManager sharedManager];

就這些,你現(xiàn)在在應(yīng)用中就有一個(gè)共享的實(shí)例,該實(shí)例只會(huì)被創(chuàng)建一次。

該方法有很多優(yōu)勢(shì):

1 線程安全

2 很好滿足靜態(tài)分析器要求

3 和自動(dòng)引用計(jì)數(shù)(ARC)兼容

4 僅需要少量代碼

該方法的劣勢(shì)就是它仍然運(yùn)行創(chuàng)建一個(gè)非共享的實(shí)例:

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

有些時(shí)候你希望有這種行為,但如果正在想要的是僅一個(gè)實(shí)例被實(shí)例化就需要注意這點(diǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1、OC中創(chuàng)建線程的方法是什么?如果指定在主線程中執(zhí)行代碼?如何延時(shí)執(zhí)行代碼?!倦y度系數(shù)★★】 1)創(chuàng)建線程的方法...
    木旁_G閱讀 2,080評(píng)論 2 16
  • 一、單例是什么?(apl??ke??(?)n 申請(qǐng)) 在 Foundation 和 Application Kit...
    甘哲157閱讀 6,267評(píng)論 6 22
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡(jiǎn)單、最易理解的設(shè)計(jì)模式,也因?yàn)樗暮?jiǎn)潔易懂,是項(xiàng)目中最...
    成熱了閱讀 4,530評(píng)論 4 34
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,603評(píng)論 30 472
  • 圖書(shū)館自習(xí)室座位有限,晚到的人很難找到空位。孫呈往往是最早到的人之一,他愛(ài)坐在靠窗的從前往后數(shù)第六張桌子,習(xí)慣性地...
    豐城劍回閱讀 612評(píng)論 17 18

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