我們都知道内边,編程中涉及到開發(fā)模式有很多,iOS中常用的設(shè)計(jì)模式也有很多待锈。之所以將單利模式拿出來第一個(gè)講漠其,當(dāng)然是因?yàn)樗匾耍蝗荒牵瑢?duì)吧和屎。說單利模式是iOS開發(fā)中最中重要的開發(fā)模式或許有些說大了拴驮。但是毫無疑問,單利模式是iOS開發(fā)過程中最常用柴信,最重要的開發(fā)模式之一套啤。
編寫單利類的時(shí)候一定要注意一下幾點(diǎn):
1.單利類創(chuàng)建一個(gè)實(shí)例
2.實(shí)例必須有單利類自己創(chuàng)建
3.必須向整個(gè)系統(tǒng)提供這個(gè)實(shí)例
使用單利的理由:
1.節(jié)省內(nèi)存開銷。如果某個(gè)對(duì)象需要被多個(gè)其它對(duì)象使用颠印,那可以考慮使用單例纲岭,因?yàn)檫@樣該類只使用一份內(nèi)存資源抹竹。
2.使用單例线罕,可以確保其它類只獲取類的一份數(shù)據(jù)(變量值)。
單利的優(yōu)缺點(diǎn):
優(yōu)點(diǎn)
1窃判、提供了對(duì)唯一實(shí)例的受控訪問钞楼。
2、由于在系統(tǒng)內(nèi)存中只存在一個(gè)對(duì)象袄琳,因此可以節(jié)約系統(tǒng)資源询件,對(duì)于一些需要頻繁創(chuàng)建和銷毀的對(duì)象單例模式無疑可以提高系統(tǒng)的性能。
3.因?yàn)閱卫J降念惪刂屏藢?shí)例化的過程唆樊,所以類可以更加靈活修改實(shí)例化過程宛琅。
缺點(diǎn)
1、由于單利模式中沒有抽象層逗旁,因此單例類的擴(kuò)展有很大的困難嘿辟。
2、單例類的職責(zé)過重片效,在一定程度上違背了“單一職責(zé)原則”红伦。
創(chuàng)建之前咱們?cè)蹅兿却笾抡f一下過程,自己總結(jié)的可能沒有網(wǎng)上大神們寫的:
1.創(chuàng)建一個(gè)全部局變量淀衣,并初始化為nil
2.創(chuàng)建一個(gè)構(gòu)造方法昙读,并且在這個(gè)變量為nil的時(shí)候,創(chuàng)建一個(gè)本類實(shí)例給他膨桥。
3.重寫allocWithZone蛮浑,保證其他人用alloc和init的時(shí)候不創(chuàng)建新的實(shí)例。
4.不要像網(wǎng)上寫的那樣去重寫copy方法只嚣,個(gè)人表示不懂陵吸。本身對(duì)單利對(duì)象使用copy方法就是有問題的。大家想想copy方法的實(shí)質(zhì)介牙,應(yīng)該會(huì)明白點(diǎn)壮虫。
閑話就說那么多吧,今天我們既然是徹底的代理模式,咱們就要看看以前我們創(chuàng)建單利的方式囚似。我們以前創(chuàng)建單利大約分為兩種剩拢。首先看第一種:
1.首先創(chuàng)建全局變量
static ShareInstance *instance = nil;
2.首先重寫allocWithZone方法
+ (id)allocWithZone:(struct _NSZone *)zone {
@synchronized(self) {
if (instance == nil) {
instance = [super allocWithZone:zone];
}
}
return instance;
}
然后創(chuàng)建公共接口
+ (instancetype)shareInstance {
@synchronized(self) {
if(instance == nil) {
instance = [[self alloc] init];
}
}
return instance;
}
以上的寫法在GCD出現(xiàn)之前非常的流行,但是在GCD之后饶唤,蘋果公司推出了另外一種寫寫法徐伐,也是現(xiàn)在比較流行的單利的寫法。實(shí)現(xiàn)代碼如下
1.聲明靜態(tài)的全局變量
static ShareInstance instance = nil;
2.重寫allocWithZone方法
+ (id)allocWithZone:(struct _NSZone *)zone {
if (instance == nil) {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [super allocWithZone:zone];
});
}
return instance;
}
3.創(chuàng)建公共接口
+ (Person *)shareInstance {
dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
這樣單利模式的創(chuàng)建就大致完成了募狂。對(duì)于網(wǎng)上各位大神們的重寫copy的方法办素,我本人表示不能理解。我不知道如果有人對(duì)單利對(duì)象使用copy方法祸穷,還能進(jìn)你們公司性穿,你們公司的技術(shù)團(tuán)隊(duì),可見一斑啊雷滚。