Objective-C常用到幾種單例的實現(xiàn)方式

單例模式

一個類在整個系統(tǒng)中有且僅有一個實例。

單例模式的作用

可以保證在程序運行過程中,一個類只有一個實例,而且該實例易于被外界訪問。單例模式控制了實例個數(shù),從而節(jié)約系統(tǒng)資源。

單例模式的使用場合

在整個應(yīng)用程序中,共享一份資源(這份資源只需要創(chuàng)建初始化 1 次),一般用于工具類。例如:登陸控制器,網(wǎng)絡(luò)數(shù)據(jù)請求,音樂播放器等一個工程需要使用多次的控制器或方法。iOS 中 UIApplication、NSFileManager、NSUserDefaults 等都是單例模式。

優(yōu)點:

對實例個數(shù)進行控制,節(jié)約系統(tǒng)資源。
如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。
單例模式中,因為類控制了實例化過程,所以類可以更加靈活修改實例化過程。

缺點:

單例對象一旦建立,對象指針是保存在靜態(tài)區(qū)的。單例對象在堆中分配的內(nèi)存空間,會在應(yīng)用程序終止后才會被釋放。
單例類無法繼承,因此很難進行類的擴展。
單例不適用于變化的對象,如果同一類型的對象在不同的場景總是發(fā)生變化,單例就會引起數(shù)據(jù)的錯誤,不能保存彼此的狀態(tài)。

單例模式的實現(xiàn)方式

1.第一種方式,重寫+allocWithZone:方法:

+(instancetype)allocWithZone:(struct _NSZone *)zone{
static id instance = nil;
@synchronized (self) { //為了線程安全,加上互斥鎖
if (instance == nil) {
instance = [super allocWithZone:zone];
}
}
return instance;
}

2.第二種方式,不用重寫+allocWithZone:方法,而是直接用@synchronized 來保證線程安全,其它與上面這個方法一樣

+(instancetype)shareInstance{
static id instance = nil;
//用@synchronized 來保證線程安全
@synchronized (self) {
if (instance == nil) {
instance = [[self alloc] init];
}
}
return instance;
}

3.通過 GCD 的 dispatch_once 來實現(xiàn)單例,同樣可以在保證線程安全的前提下來實現(xiàn)單例

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

注意

為了防止別人不小心利用 alloc/init 方式創(chuàng)建示例,也為了防止別人故意為之,我們要保證不管用什么方式創(chuàng)建都只能是同一個實例對象,這就得重寫 alloc 方法,實現(xiàn)如下:

+(instancetype)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
return instance;
}

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

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

  • 線程間的通信 從子線程回到主線程 延時執(zhí)行 iOS常見的延時執(zhí)行有兩種方式p 調(diào)用NSObject的方法 p 使用...
    一抹月光3053閱讀 816評論 1 12
  • 在開發(fā)中經(jīng)常會用到單例設(shè)計模式,目的就是為了在程序的整個生命周期內(nèi),只會創(chuàng)建一個類的實例對象,而且只要程序不被殺死...
    不要重名就好閱讀 598評論 0 0
  • 什么是單例模式? >是開發(fā)設(shè)計模式(共23種)中的1種 >它可以保證在程序運行過程,一個類只有一個實例(一個對象)...
    泥孩兒0107閱讀 284評論 0 0
  • 在開發(fā)中經(jīng)常會用到單例設(shè)計模式,目的就是為了在程序的整個生命周期內(nèi),只會創(chuàng)建一個類的實例對象,而且只要程序不被殺死...
    VincentHK閱讀 734評論 0 3
  • 昨晚兒子就跟我說好,今天下午放學后來圖書館看書。于是放學后我?guī)е鴥鹤又北紙D書館。我們每人選了一本書看了起來。我...
    蘋果杭媽閱讀 231評論 0 0

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