objc 中的單例

現(xiàn)在接手的是一份前人的代碼,其中為了在多處使用私聊,將私聊類(lèi)作為父類(lèi),讓所有會(huì)用到私聊的地方都直接繼承了這個(gè)父類(lèi)。這種方式不太好,之后看別人的代碼的時(shí)候,突然想起來(lái),還有單例這個(gè)東西可以用。但是單例是否真的適合我的場(chǎng)景?先來(lái)看看,objc 中的單例有哪些不同之處。

當(dāng)某個(gè)類(lèi)在整個(gè)程序中只需要存在一個(gè)實(shí)例的時(shí)候,就可以使用單例模式。一般管理類(lèi)可以用到單例。在其他語(yǔ)言比如 C++/java 中,可以通過(guò)將構(gòu)造函數(shù)私有化來(lái)避免對(duì)面的重復(fù)創(chuàng)建,但在oc中需要另外的機(jī)制來(lái)實(shí)現(xiàn)。

+(instancetype)shareInstance{
    static dispatch_once_t once;
    static id instance;
    dispatch_once(&once, ^( instance = [[self alloc] init];));
    return instance;
}

在實(shí)際使用之中,有一些問(wèn)題需要考慮:

  1. "單例就是披著羊皮的全局狀態(tài)":?jiǎn)卫梢杂迷谌魏蔚胤蕉恍枰伙@示聲明依賴。
  2. 對(duì)象的生命周期:由于單例實(shí)例沒(méi)有明確的所有者,他自己管理自己的生命周期,于是,關(guān)閉一個(gè)單例實(shí)例變得困難。
  3. dispatch_once 死鎖:在單例的實(shí)例化之中,如果出現(xiàn)了循環(huán)引用,就會(huì)出現(xiàn)死鎖。其實(shí)這個(gè)也是第一個(gè)需要注意的點(diǎn)的引申,因?yàn)闆](méi)有顯示聲明依賴,就容易出現(xiàn)這種情況。

參考:
1 Android源碼分析之單例模式
2 Objective-c單例模式的正確寫(xiě)法
3 避免濫用單例
4 濫用單例之dispatch_once死鎖

最后編輯于
?著作權(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)容

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