ios單例的寫(xiě)法及理解

1.ios的單例模式有兩種官方寫(xiě)法:

1)不使用GCD的方式

#import ?"Manager.h"

static ? Manager ? *manager;

@implementation ?Manager

+(Manager *))shareManager {

? ? ? ? ?if (!manager) {

? ? ? ? ? ? ? ? ? ?manager = [super ?allocWithZone:NULL] ?init];

? ? ? ? ? }

? ? ? ? ?return manager;

}


@end;

2)使用GCD的方式

#import ?"Manager.h"?

@implementataion ?Manager?

+(Manager *)shareManager {

? ? ? ? ? ? ?static ?Manager *shareManager;

? ? ? ? ? ? ? static dispatch_once_t? predicate;

? ? ? ? ? ? ?dispatch_once(&predicate, ^{

? ? ? ? ? ? ? ? ? ? ? ? shareManager =[super? allocWithZone:NULL]? init];

? ? ? ? ? ?});

? ? ? ? ? return ? shareManager;

}

//注明:dispatch_once這個(gè)函數(shù)两曼,他可以一次保證整個(gè)應(yīng)用程序生命周期中某段代碼只被執(zhí)行

//不是使用alloc 方法修然,而是調(diào)用[super? allocWithZone:NULL]? init]; 已經(jīng)重載allocWithZone基本的對(duì)象分配方法链烈,所以要借用父類(NSObject)的功能來(lái)幫助處理底層內(nèi)存分配的雜物

當(dāng)我們調(diào)用shareManager方法時(shí)獲取到的對(duì)象是相同的,但是但當(dāng)我們通過(guò)alloc和init以及copy來(lái)構(gòu)造對(duì)象依然會(huì)創(chuàng)建新的實(shí)例。確保對(duì)象的唯一,需要封鎖用戶通過(guò)alloc和init以及copy來(lái)構(gòu)造這條道路。創(chuàng)建對(duì)象的步驟分為申請(qǐng)內(nèi)存(alloc)突雪、初始化(init),要確保對(duì)象的唯一性檩禾,在第一步這個(gè)階段我們就要攔截它挂签,當(dāng)我們調(diào)用alloc方法時(shí),oc內(nèi)部會(huì)調(diào)用allocWithZone這個(gè)方法來(lái)申請(qǐng)內(nèi)存盼产,我們覆寫(xiě)這個(gè)方法饵婆,然后在這個(gè)方法調(diào)用shareManager返回單例對(duì)象。

+(id)allocWithZone:(struct _NSZone *)zone {

? ? ? ? ? ? ? ? ?return ? ? [Manager ? ?shareManager];

}

-(id)copyWithZone:(NSZone *)zone {

? ? ? ? ? ?return? ? [Manager? ? shareManager];

}

-(id)mutablecopyWithZone:(NSZone *)zone {

? ? ? ? ? ?return? ? [Manager? ? shareManager];

}

@end

2.alloc和allocWithZone

在初始化一個(gè)對(duì)象時(shí)([Class alloc] ?init];)其實(shí)做了兩件事,alloc給對(duì)象分配內(nèi)存空間侨核,init是對(duì)對(duì)象的初始化草穆,包括設(shè)置成員變量初始值這些工作。

而給對(duì)象分配內(nèi)存空間搓译,除了alloc方法之外還有另一個(gè)方法:allocWithZone.在NSObject類的官方文檔里面悲柱,allocWithZone方法介紹說(shuō),該方法的參數(shù)是被忽略的些己,正確的做法是傳nil或者NULL參數(shù)給他豌鸡。(這個(gè)方法存在是歷史遺留原因,文檔里memory zone已經(jīng)被棄用了段标,只是歷史原因才保留這個(gè)接口)

實(shí)踐證明涯冠,alloc方法初始化一個(gè)類的實(shí)例時(shí),默認(rèn)調(diào)用allocWithZone的方法逼庞,為了保持單例實(shí)例的唯一性需要覆蓋所有會(huì)生成新的實(shí)例方法蛇更,如果有人初始化這個(gè)單例的時(shí)候不走allocWithZone,而是直接[Class ?alloc] ?init]; ,那么這個(gè)單例就不再是單例了,所以把這個(gè)方法堵上

3.NSZone?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赛糟,一起剝皮案震驚了整個(gè)濱河市派任,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌璧南,老刑警劉巖掌逛,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異司倚,居然都是意外死亡颤诀,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)对湃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人遗淳,你說(shuō)我怎么就攤上這事拍柒。” “怎么了屈暗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵拆讯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我养叛,道長(zhǎng)种呐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任弃甥,我火速辦了婚禮爽室,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淆攻。我一直安慰自己阔墩,他們只是感情好嘿架,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著啸箫,像睡著了一般耸彪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忘苛,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天蝉娜,我揣著相機(jī)與錄音,去河邊找鬼扎唾。 笑死召川,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的稽屏。 我是一名探鬼主播扮宠,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狐榔!你這毒婦竟也來(lái)了坛增?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤薄腻,失蹤者是張志新(化名)和其女友劉穎收捣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體庵楷,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罢艾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尽纽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咐蚯。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弄贿,靈堂內(nèi)的尸體忽然破棺而出春锋,到底是詐尸還是另有隱情,我是刑警寧澤差凹,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布期奔,位于F島的核電站,受9級(jí)特大地震影響危尿,放射性物質(zhì)發(fā)生泄漏呐萌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一谊娇、第九天 我趴在偏房一處隱蔽的房頂上張望肺孤。 院中可真熱鬧,春花似錦、人聲如沸渠旁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)顾腊。三九已至粤铭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間杂靶,已是汗流浹背梆惯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吗垮,地道東北人垛吗。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像烁登,于是被迫代替她去往敵國(guó)和親怯屉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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