IOS --- 單例設(shè)計(jì)模式

一.單例設(shè)計(jì)模式

1.單例模式:某一個類在所在應(yīng)用程序中只有一個實(shí)例盲憎,將類的實(shí)例化限制成僅一個對象的設(shè)計(jì)模式善玫。

2.static關(guān)鍵字:會在聲明變量的時候分配內(nèi)存,在程序運(yùn)行期間只分配一次內(nèi)存粉私。之后再訪問時绷旗,實(shí)際都是在訪問原先分配的內(nèi)存;如果使用static來修飾局部變量,那么局部變量在代碼塊結(jié)束后將不會回收际乘,下次使用保持上次使用后的值坡倔。如果使用static來修飾全局變量,那么表示該全局變量只在本文件中有效脖含。static變量的作用域被限制在定義變量的當(dāng)前文件中罪塔,其它文件是不能訪問,只能通過當(dāng)前類的實(shí)例訪問。

3.單例是不可繼承养葵,使用帶參數(shù)的宏完成通用版單例模式代碼,注意條件編譯的代碼不能包含在宏定義里面征堪。

#import "NSManager.h"

@implementation NSManager

//提供一個static修飾的全局變量,強(qiáng)引用著已經(jīng)實(shí)例化的單例對象實(shí)例

static NSManager *_instance;

static BOOL token = YES;

//類方法关拒,返回一個單例對象

+ (instancetype)shareInstance

{

return [[self alloc]init];

}

//保證永遠(yuǎn)只分配一次存儲空間

+(instancetype)allocWithZone:(struct _NSZone *)zone

{

//兩種方式保證線程安全并只執(zhí)行一次

? ? if (token)

? ? {


? ? ? ? ? ? ? ? ? ? ? ? ? static dispatch_once_t onceToken;

? ? ? ? ? ? ? ? ? ? ? ? ? dispatch_once(&onceToken, ^{

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?_instance = [super allocWithZone:zone];

? ? ? ? ? ? ? ? ? ? ? ? ? ? });

? ? ? ?}else

? ? ? {


? ? ? ? ? @synchronized(self)

? ? ? ? ? ? {

? ? ? ? ? ? //保證只實(shí)例化一次

? ? ? ? ? ? ? ? ? ?if (_instance == nil)

? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ?//重寫allocWithZone方法 將實(shí)例_instance單獨(dú)放在一個內(nèi)存池中進(jìn)行內(nèi)存操作

? ? ? ? ? ? ? ?_instance = [super allocWithZone:zone];

? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ?}

? ? ? ? return _instance;

}

/*

[[ self alloc] init]; 調(diào)用時佃蚜,會默認(rèn)調(diào)用allocWithZone方法的? _instance 最終是在 allocWithZone方法中完成了初始化操作。

_instance = [super allocWithZone:zone];

原來allocWithZone是在給對象_instance分配內(nèi)存空間着绊。其中zone可以想象成一個內(nèi)存池谐算,alloc,allocWithZone或是dealloc這些操作,都是在這個內(nèi)存池中操作的归露。cocoa總是會配置一個默認(rèn)的NSZone洲脂,任何默認(rèn)的內(nèi)存操作都是在這個“zone”上操作的。默認(rèn)的NSZone的缺陷在于剧包,它是全局范圍的恐锦,時間一長往果,必然會導(dǎo)致內(nèi)存的碎片化,如果你需要大量的alloc一些object一铅,那么性能就會受到一些影響陕贮。


另外通過測試

alloc會默認(rèn)調(diào)用allocWithZone方法

如果不重寫allocWithZone方法,在調(diào)用alloc和allocWithZone方法產(chǎn)生的實(shí)例可能不是同一個實(shí)例馅闽。因?yàn)闀_辟新的內(nèi)存空間

*/

/*

1. mutableCopy 創(chuàng)建一個新的可變對象飘蚯,并初始化為原對象的值,新對象的引用計(jì)數(shù)為 1福也;

2. copy 返回一個不可變對象局骤。分兩種情況:(1)若原對象是不可變對象,那么返回原對象暴凑,并將其引用計(jì)數(shù)加 1 峦甩;(2)若原對象是可變對象,那么創(chuàng)建一個新的不可變對象现喳,并初始化為原對象的值凯傲,新對象的引用計(jì)數(shù)為 1。

所以需要避免開辟新的內(nèi)存空間 ?嗦篱, 重寫copy方法并返回唯一實(shí)例冰单。

*/

- (nonnull id)copyWithZone:(nullable NSZone *)zone

{

return _instance;

}

- (nonnull id)mutableCopyWithZone:(nullable NSZone *)zone

{

? ? ?return _instance;

}

@end

代碼地址:gitHub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市灸促,隨后出現(xiàn)的幾起案子诫欠,更是在濱河造成了極大的恐慌,老刑警劉巖浴栽,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荒叼,死亡現(xiàn)場離奇詭異,居然都是意外死亡典鸡,警方通過查閱死者的電腦和手機(jī)被廓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萝玷,“玉大人嫁乘,你說我怎么就攤上這事∏虻铮” “怎么了蜓斧?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汁尺。 經(jīng)常有香客問我法精,道長多律,這世上最難降的妖魔是什么痴突? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任搂蜓,我火速辦了婚禮,結(jié)果婚禮上辽装,老公的妹妹穿的比我還像新娘帮碰。我一直安慰自己,他們只是感情好拾积,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布殉挽。 她就那樣靜靜地躺著,像睡著了一般拓巧。 火紅的嫁衣襯著肌膚如雪斯碌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天肛度,我揣著相機(jī)與錄音傻唾,去河邊找鬼。 笑死承耿,一個胖子當(dāng)著我的面吹牛冠骄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播加袋,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼凛辣,長吁一口氣:“原來是場噩夢啊……” “哼职烧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起阳堕,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤跋理,失蹤者是張志新(化名)和其女友劉穎恬总,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壹堰,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年贱纠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谆焊。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辜王,到底是詐尸還是另有隱情,我是刑警寧澤呐馆,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站汹来,受9級特大地震影響续膳,放射性物質(zhì)發(fā)生泄漏收班。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一摔桦、第九天 我趴在偏房一處隱蔽的房頂上張望炮车。 院中可真熱鬧,春花似錦酣溃、人聲如沸瘦穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛或。三九已至,卻和暖如春碘饼,著一層夾襖步出監(jiān)牢的瞬間熙兔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工艾恼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留住涉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓钠绍,卻偏偏與公主長得像舆声,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子柳爽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

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