現(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)題需要考慮:
- "單例就是披著羊皮的全局狀態(tài)":?jiǎn)卫梢杂迷谌魏蔚胤蕉恍枰伙@示聲明依賴。
- 對(duì)象的生命周期:由于單例實(shí)例沒(méi)有明確的所有者,他自己管理自己的生命周期,于是,關(guān)閉一個(gè)單例實(shí)例變得困難。
- 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死鎖