偽單例模式的兩種寫法,@synchronized鎖和dispatch_once

單例

單例模式,其實是非常常見的一種模式,簡單來說就是保證整個生命周期內(nèi),該對象只有一份拷貝,所以兩點保證,首先保證在生命周期內(nèi)該對象不被銷毀,所以需要static修飾一下,將對象保存在靜態(tài)數(shù)據(jù)區(qū),同時保證該對象只會被初始化一次,這里有兩個思考,synchronized鎖或者GCD提供的dispatch_once。實現(xiàn)上面兩步就完成了一個偽單例,真正的單例還需要保證,不管是copy,mutableCopy,copyWithZone都需要返回同一個對象,重寫這些方法直接返回self,同時引用計數(shù)也沒有意思,可以重寫alloc,retain,release,autoRelease,以及retainCount的set方法。

下面提供偽單例的兩種寫法實現(xiàn):

//synchronized鎖
+ (Obj *)sharedInstance {
        static Obj *sharedInstance = nil;  //注意static修飾
        //再加鎖前首先判斷,對象是否創(chuàng)建,防止每次進來都加鎖造成資源浪費
        if (!sharedInstance) {
            @synchronized
            //加鎖后再判斷一次對象是否存在,是保證只初始化一次
             if (!sharedInstance){
                sharedInstance = [[Obj alloc] init];
             }
        }
        return sharedInstance;
}

//dispatch_once實現(xiàn)
+ (Obj *)sharedInstance {
   static Obj *sharedInstance = nil;//static修飾
   static dispatch_once_t onceToken; //將該token也保存到靜態(tài)區(qū),保證dispatch_once只執(zhí)行一次
   dispatch_once(&onceToken, ^{
       sharedInstance = [[Obj alloc] init];
   });
   return sharedInstance;
}

以上就是偽單例的兩種實現(xiàn)方式,但是注意單例模式不可濫用,會影響編譯速度等。


覺得有用,請幫忙點亮紅心


Better Late Than Never!
努力是為了當(dāng)機會來臨時不會錯失機會。
共勉!

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

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