ios單例模式詳解

很多人面試都有被問(wèn)到單例,單例并不陌生,但是要想說(shuō)的完整,可以參考我整理的以下資料,希望能幫到大家

手寫單例(從實(shí)現(xiàn)單例的幾種方式, 單例在內(nèi)存中的位置, 單例的生命周期等等方面作答)

(是什么)單例模式的意思就是只有一個(gè)實(shí)例尽超。(作用)單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例,節(jié)約系統(tǒng)資源梧躺。(使用場(chǎng)合) 在整個(gè)應(yīng)用程序中,共享一份資源(這份資源只需要?jiǎng)?chuàng)建初始化一次). 例如
一些網(wǎng)絡(luò)工具類/沙盒工具類/打印機(jī)/視圖窗口/等等

(單例模式的種類)分為懶漢式(用到的時(shí)候在加載)似谁、惡漢式(程序已啟動(dòng)就加載)-==>>調(diào)用load方法,在程序已進(jìn)入就有

(單例模式實(shí)現(xiàn)的方法)互斥鎖(同步鎖) dispatch_once

(單例在內(nèi)存中的位置) static修飾的, 存在常量區(qū)

(單例的生命周期)跟隨著AppDelegate的銷毀而銷毀
單例需要重寫的方法:
模仿蘋果源生的寫法創(chuàng)建單例單例的方法名都是share+xxxx的一個(gè)形式,這也是大家在使用單例時(shí)默認(rèn)的方法但是為了防止單例被用alloc init的方法創(chuàng)建出來(lái)需要重寫

+ (instancetype)allocWithZone:(struct _NSZone *)zone(該方法在調(diào)用alloc init方法時(shí)會(huì)自定調(diào)用掠哥,保證單例只開(kāi)辟一個(gè)空間)
+(instancetype)copyWithZone:(struct _NSZone *)zone(同時(shí)為了防止使用copy創(chuàng)建單例需要重寫,遵守<NSCoping>協(xié)議)
+(instancetype)share+xxxx;(最后提供一個(gè)外界方法創(chuàng)建唯一的實(shí)例 )
static  id  instance;//指的是Singleton這個(gè)類,把對(duì)象定義為靜態(tài)的全局變量,始終指向?qū)嵗龅膶?duì)象
+ (instancetype)sharedSingleton{

    //GCD寫法 (執(zhí)行效率高)
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{        singleton = [[Singleton alloc]init];    });
   
return instance;

}


MRC 中增加如下方法的實(shí)現(xiàn):

- (instancetype)retain { return  self; } 因?yàn)橹挥幸粋€(gè)實(shí)例對(duì)象巩踏,所以retain不能增加引用計(jì)數(shù)。
- (NSUInteger)retainCount { return  1; } 因?yàn)橹挥幸粋€(gè)實(shí)例對(duì)象续搀,設(shè)置默認(rèn)引用計(jì)數(shù)塞琼。這里是可以取的NSUInteger的最大值,當(dāng)然也可以設(shè)置成1或其他值禁舷。
- (oneway void)release { } oneway void是用于多線程編程中彪杉,表示單向執(zhí)行,不能“回滾”牵咙,即原子操作
- (instancetype)autorelease { return self; }

<p>

代碼如下

#import "Singleton.h"
@interface Singleton()<NSCopying>

@end

@implementation Singleton
//全局的變量,指的就是Singleton這個(gè)對(duì)象,靜態(tài)全局變量派近,始終指向?qū)嵗龅膶?duì)象
   static id instance;
//
+ (instancetype)shardSingleton{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
        
        //創(chuàng)建類
        instance = [[self alloc]init];
    });
    return instance;
}

//創(chuàng)建alloc init 時(shí)候創(chuàng)建,會(huì)調(diào)用allocWithZone ,保證創(chuàng)建出來(lái)這個(gè)對(duì)象是唯一的
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
       
        //返回自己
        instance = [super allocWithZone:zone];
    });
    return instance;
}

//防止外界拷貝造成多個(gè)實(shí)例
- (id)copyWithZone:(NSZone *)zone{
    return instance;
}

//若果是MRC,不僅要實(shí)現(xiàn)以上的copyWithZone,allocWithZone
//需要實(shí)現(xiàn)release,autorelease,retain,retainCount
/**
 oneway void是用于多線程編程中,表示單向執(zhí)行洁桌,不能“回滾”渴丸,即原子操作
 - (oneway void)release{
  //單例模式不需要被釋放
}
 
 - (instacetype)autorelease{
   
   return instace;//
 }
 
 因?yàn)橹挥幸粋€(gè)實(shí)例對(duì)象,所以retain不能增加引用計(jì)數(shù)
 - (instacetype)retain{
   return instance;
 }
 
 - (NSUInteger)retainCount{
    return 1;
 }
 
 */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末另凌,一起剝皮案震驚了整個(gè)濱河市谱轨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌途茫,老刑警劉巖碟嘴,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異囊卜,居然都是意外死亡娜扇,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門栅组,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雀瓢,“玉大人,你說(shuō)我怎么就攤上這事玉掸∪恤铮” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵司浪,是天一觀的道長(zhǎng)泊业。 經(jīng)常有香客問(wèn)我把沼,道長(zhǎng),這世上最難降的妖魔是什么吁伺? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任饮睬,我火速辦了婚禮,結(jié)果婚禮上篮奄,老公的妹妹穿的比我還像新娘捆愁。我一直安慰自己,他們只是感情好窟却,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布昼丑。 她就那樣靜靜地躺著,像睡著了一般夸赫。 火紅的嫁衣襯著肌膚如雪菩帝。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天憔足,我揣著相機(jī)與錄音胁附,去河邊找鬼。 笑死滓彰,一個(gè)胖子當(dāng)著我的面吹牛控妻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揭绑,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼弓候,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了他匪?” 一聲冷哼從身側(cè)響起菇存,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎邦蜜,沒(méi)想到半個(gè)月后依鸥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡悼沈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贱迟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片絮供。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衣吠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壤靶,到底是詐尸還是另有隱情缚俏,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站忧换,受9級(jí)特大地震影響恬惯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜包雀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一宿崭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧才写,春花似錦、人聲如沸奖蔓。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吆鹤。三九已至厨疙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疑务,已是汗流浹背沾凄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留知允,地道東北人撒蟀。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像温鸽,于是被迫代替她去往敵國(guó)和親保屯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容