單例的使用以及制定
- 我們先來了解何為單利:
單例模式是一種常用的軟件設(shè)計模式,通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源,如果希望系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。iOS中最常見的單例就是UIApplication。
- 單利的應(yīng)用場景:
音頻播放,背景音樂!硬件資源:加速器、[UIScreen mainScreen]
sharedXX, mainXXX
- 優(yōu)點:可以阻止其他對象實例化單例對象的副本,從而確保所有對象都訪問唯一實例
- 缺點:單例對象一旦建立,對象指針是保存在靜態(tài)區(qū)的,單例對象在堆中分配的內(nèi)存空間,會在應(yīng)用程序終止后才會被釋放
- 溫馨提示:只有確實需要唯一使用的對象才需要考慮單例模式,不要濫用單例
- 下邊說下如何去創(chuàng)建一個單例:
(1)重寫allocWithZone,用dispatch_once實例化一個靜態(tài)變量
(2) 寫一個+sharedXXX方便其他類調(diào)用 ,在iOS中,所有對象的內(nèi)存空間的分配,最終都會調(diào)用allocWithZone方法,如果要做單例,需要重寫此方法。
- 下邊是代碼示例:
+ (id)allocWithZone:(struct _NSZone *)zone{
// dispatch_once是線程安全onceToken默認(rèn)為0
static sharedObj * instance;
static dispatch_once_t onceToken;
// dispatch_once宏可以保證塊代碼中的指令只被執(zhí)行一次
dispatch_once(&onceToken, ^{
// 在多線程環(huán)境下,永遠(yuǎn)只會被執(zhí)行一次,instance只會被實例化一次
instance = [super allocWithZone:zone];
});
return instance;
}
- 下邊這個方法是在外部要調(diào)用的,所以要在.h文件做聲明
+ (instancetype)sharedInstance{
// 如果有兩個線程同時實例化,很有可能創(chuàng)建出兩個實例來
return [[self alloc] init];
}
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。