現(xiàn)在接手的是一份前人的代碼,其中為了在多處使用私聊办悟,將私聊類作為父類霜幼,讓所有會用到私聊的地方都直接繼承了這個父類。這種方式不太好誉尖,之后看別人的代碼的時候,突然想起來铸题,還有單例這個東西可以用铡恕。但是單例是否真的適合我的場景?先來看看丢间,objc 中的單例有哪些不同之處探熔。
當某個類在整個程序中只需要存在一個實例的時候,就可以使用單例模式烘挫。一般管理類可以用到單例诀艰。在其他語言比如 C++/java 中,可以通過將構造函數(shù)私有化來避免對面的重復創(chuàng)建饮六,但在oc中需要另外的機制來實現(xiàn)其垄。
+(instancetype)shareInstance{
static dispatch_once_t once;
static id instance;
dispatch_once(&once, ^( instance = [[self alloc] init];));
return instance;
}
在實際使用之中,有一些問題需要考慮:
- "單例就是披著羊皮的全局狀態(tài)":單例可以用在任何地方而不需要被顯示聲明依賴卤橄。
- 對象的生命周期:由于單例實例沒有明確的所有者绿满,他自己管理自己的生命周期,于是窟扑,關閉一個單例實例變得困難喇颁。
- dispatch_once 死鎖:在單例的實例化之中,如果出現(xiàn)了循環(huán)引用嚎货,就會出現(xiàn)死鎖橘霎。其實這個也是第一個需要注意的點的引申,因為沒有顯示聲明依賴殖属,就容易出現(xiàn)這種情況姐叁。
參考:
1 Android源碼分析之單例模式
2 Objective-c單例模式的正確寫法
3 避免濫用單例
4 濫用單例之dispatch_once死鎖