單例

iOS單例模式

什么是單例模式枕稀?

單例模式:保證一個類僅有一個實例仍劈,并提供一個唯一的全局訪問點哈雏。

蘋果大量使用了此模式卓起。例如:[NSUserDefaults standardUserDefaults],[UIApplication sharedApplication],[UIScreen mainScreen],[NSFileManager defaultManager]载荔,所有的這些方法都返回一個單例對象盾饮。

單例模式的優(yōu)缺點

優(yōu)點

將一些初始化比較耗費資源的類寫成單例,避免重復(fù)的初始化耗費資源懒熙∏鹚穑或者一些創(chuàng)建和銷毀比較頻繁的類,用單例模式可以提高性能煌珊。

單例的唯一性和全局性可以很方便的用來傳值号俐。

缺點

單例創(chuàng)建之后,對象保存在靜態(tài)區(qū)定庵,在程序結(jié)束之后才會釋放吏饿,過多的單例會增加常駐內(nèi)存消耗。

單例的職責(zé)過重蔬浙,在一定程度上違背了“單一職責(zé)原則”猪落。

單例沒有抽象層,因此單例類的擴展有很大困難畴博。

由于程序的任一模塊都可以訪問單例笨忌,如果某個與單例進行交互的代碼出現(xiàn)了問題,很容易影響其他使用到單例的地方俱病。

單例的寫法

創(chuàng)建一個單例類官疲,在.h文件聲明單例的初始化方法袱结。

+ (instancetype)shareSingleton;

在.m文件里實現(xiàn),使用static修飾途凫,保證實例全局存在垢夹。使用GCD的dispatch_once方法來保證初始化代碼只執(zhí)行一次。

@implementation LDSingletonstatic LDSingleton *instance;+ (instancetype)shareSingleton {? ? static dispatch_once_t onceToken;? ? dispatch_once(&onceToken, ^{? ? ? ? instance = [[self alloc]init];? ? });? ? return instance;}@end

為了避免在外部使用其他初始化方法創(chuàng)建單例對象维费,導(dǎo)致單例類有多個實例對象果元。可以重寫allocWithZone:犀盟、copyWithZone:和mutableCopyWithZone:方法而晒,并返回唯一的單例對象。

禁用其他獲取實例方法

也可以禁用外部調(diào)用其他初始化方法阅畴,來保證單例的唯一性倡怎。在.h文件聲明:

- (instancetype)init NS_UNAVAILABLE;+ (instancetype)new NS_UNAVAILABLE;- (id)copy NS_UNAVAILABLE;- (id)mutableCopy NS_UNAVAILABLE;

這些方法不用實現(xiàn)。由于使用NS_UNAVAILABLE宏贱枣,在外部調(diào)用init等方法時編譯器會報錯诈胜。

一個便捷的可繼承單例方法

這有個demo

導(dǎo)入文件:

只要引入頭文件冯事,遵守協(xié)議就可以成為一個單例類。

#import "NSObject+LDOptionalSingleton.h"@interface Person : NSObject<LDOptionalSingleton>@end

獲取單例對象:

[Person LD_sharedSingleton];

原理是使用runtime關(guān)聯(lián)對象方法血公,加上分類和協(xié)議昵仅。單例可以繼承,并且父類和子類擁有各自的單例對象累魔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摔笤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子垦写,更是在濱河造成了極大的恐慌吕世,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梯投,死亡現(xiàn)場離奇詭異命辖,居然都是意外死亡,警方通過查閱死者的電腦和手機分蓖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門尔艇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人么鹤,你說我怎么就攤上這事终娃。” “怎么了蒸甜?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵棠耕,是天一觀的道長余佛。 經(jīng)常有香客問我,道長窍荧,這世上最難降的妖魔是什么辉巡? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮搅荞,結(jié)果婚禮上红氯,老公的妹妹穿的比我還像新娘。我一直安慰自己咕痛,他們只是感情好痢甘,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茉贡,像睡著了一般塞栅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腔丧,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天放椰,我揣著相機與錄音,去河邊找鬼愉粤。 笑死砾医,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衣厘。 我是一名探鬼主播如蚜,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼影暴!你這毒婦竟也來了错邦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤型宙,失蹤者是張志新(化名)和其女友劉穎撬呢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妆兑,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡魂拦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搁嗓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晨另。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谱姓,靈堂內(nèi)的尸體忽然破棺而出借尿,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布路翻,位于F島的核電站狈癞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茂契。R本人自食惡果不足惜蝶桶,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掉冶。 院中可真熱鬧真竖,春花似錦、人聲如沸厌小。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽璧亚。三九已至讨韭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間癣蟋,已是汗流浹背透硝。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疯搅,地道東北人濒生。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像幔欧,于是被迫代替她去往敵國和親甜攀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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

  • 一. ARC環(huán)境下的單例模式 單例模式的基本概念單例, 顧名思義, 即在整個程序中, 某一個類只有唯一一個實例, ...
    面糊閱讀 757評論 0 50
  • 在開發(fā)中經(jīng)常會用到單例設(shè)計模式琐馆,目的就是為了在程序的整個生命周期內(nèi),只會創(chuàng)建一個類的實例對象恒序,而且只要程序不被殺死...
    不要重名就好閱讀 548評論 0 0
  • 在開發(fā)中經(jīng)常會用到單例設(shè)計模式瘦麸,目的就是為了在程序的整個生命周期內(nèi),只會創(chuàng)建一個類的實例對象歧胁,而且只要程序不被殺死...
    VincentHK閱讀 650評論 0 3
  • iOS-單例模式寫一次就夠了 一. 單例模式簡介 單例模式的作用 可以保證在程序運行過程滋饲,一個類只有一個實例,而且...
    Moker_C閱讀 396評論 0 1
  • 在開發(fā)中經(jīng)常會用到單例設(shè)計模式喊巍,目的就是為了在程序的整個生命周期內(nèi)屠缭,只會創(chuàng)建一個類的實例對象,而且只要程序不被殺死...
    零度_不結(jié)冰閱讀 443評論 0 0