iOS Common Design Patterns:常用設(shè)計模式

我們經(jīng)常在編程中使用各種設(shè)計模式,在iOS中比較常見的設(shè)計模式有:單例模式、委托模式、觀察者模式智润,當(dāng)然實際上在Cocoa和Cocoa Touch框架中不僅僅是設(shè)計到這些設(shè)計模式,還有很多設(shè)計模式以及常規(guī)設(shè)計模式的變種等等永品。那什么是設(shè)計模式呢做鹰?

在軟件工程中,設(shè)計模式(design pattern)是對軟件設(shè)計中普遍存在(反復(fù)出現(xiàn))的各種問題鼎姐,所提出的解決方案。這個術(shù)語是由埃里细瘢·伽瑪(Erich Gamma)等人在1990年代從建筑設(shè)計領(lǐng)域引入到計算機科學(xué)的炕桨。(引自維基百科)

設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的肯腕、經(jīng)過分類編目的献宫、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼实撒、讓代碼更容易被他人理解姊途、保證代碼可靠性涉瘾。 毫無疑問,設(shè)計模式于己于他人于系統(tǒng)都是多贏的捷兰;設(shè)計模式使代碼編制真正工程化立叛;設(shè)計模式是軟件工程的基石脈絡(luò),如同大廈的結(jié)構(gòu)一樣贡茅。(引自百度百科)

通過解釋我們可以基本了解設(shè)計模式是什么這個問題秘蛇,當(dāng)然我們不在這里深入探討設(shè)計模式概念理論方面的問題,而是對我們在iOS開發(fā)中常用到的幾種設(shè)計模式進行梳理顶考,以方便日常開發(fā)赁还。

Tips:設(shè)計模式和架構(gòu)模式通常容易混淆

  1. 不同點 設(shè)計模式是解決某類常見問題的方法思路總結(jié)(尺度小) 框架模式是從軟件開發(fā)總體結(jié)構(gòu)上提出的一中框架結(jié)構(gòu)(尺度大)
  2. 共同點 降低耦合度驹沿、調(diào)高可拓展性艘策、易維護

比如:MVC是架構(gòu)模式,單例是設(shè)計模式

1. 單例模式(Singleton)

什么是單例

在程序的整個生命周期內(nèi),保證類只有一個實例對象并可在全局調(diào)用渊季。

如何實現(xiàn)單例

實現(xiàn)單例我們需要注意兩點:1.我們需要保證單例被實例化一次之后柬焕,不能被重復(fù)實例化2.在多線程模式下避免同時被一個以上的線程調(diào)用實例化方法而造成多個實例。

實現(xiàn)單例:

@synchronized同步鎖

static SingletonInstant *_single = nil;

@implementation SingletonInstant

+ (instancetype)sharedInstant {
    if (!_single) { // 判斷放在加鎖之前防止多次加鎖
        @synchronized(self) { // 添加同步鎖防止保證線程安全
            _single = [[super allocWithZone:NULL] init];
        }
    }
    return _single;
}
// 上面使用allocWithZone不使用alloc是因為alloc方法會調(diào)用
// allocWithZone方法梭域,如果使用alloc還要在重載的allocWithZone中
// 在實現(xiàn)一次判斷和加鎖斑举,因此為了簡化代碼,
// 直接使用allocWithZone病涨,在重載的方法中只要調(diào)用一次單例方法就可以了
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [self sharedInstant];
}
// copy方法也會調(diào)用copyWithZone方法富玷,因此直接返回self就好
- (id)copyWithZone:(NSZone *)zone {
    return self;
}

@end

#pragma - mark MRC實現(xiàn)
static SingletonInstant *_single = nil;

+ (SingletonInstant*)sharedManager
{
    if (_single == nil) {
        @synchronized (self) {
            _single = [[super allocWithZone:NULL] init];
        }
    }
    return _single;
}

+ (id)allocWithZone:(NSZone *)zone
{
    return [[self sharedManager] retain];
}

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}
// 比ARC多出來的關(guān)于內(nèi)存管理的幾個方法
- (id)retain
{
    return self;
}

- (NSUInteger)retainCount
{
    return NSUIntegerMax;  //denotes an object that cannot be released
}

- (void)release
{
    //do nothing
}

- (id)autorelease
{
    return self;
}

更多關(guān)于alloc和allocWithZone的問題請查閱參考4,MRC實現(xiàn)查閱參考3

GCD加鎖

使用 dispatch_once_t 保證線程安全

static SingletonInstant *_single = nil;

@implementation SingletonInstant

+ (instancetype)sharedInstant {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (!_single) {
            _single = [[super allocWithZone:NULL] init];
        }
    });
    return _single;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    return [self sharedInstant];
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

@end

在dispatch_once方法中的代碼在程序的真?zhèn)€聲明周期只會執(zhí)行一次既穆。赎懦,關(guān)于GCD請自行學(xué)習(xí)。

MRC不再詳述

單例的實現(xiàn)基本雷同幻工,在網(wǎng)上也有一些大同小異的其他寫法励两,只要掌握單例思想,任何一種實現(xiàn)都是可以的囊颅,差異在細(xì)節(jié)上当悔,孰優(yōu)孰劣任君斟酌。

額踢代,先寫一種未完待續(xù)……(如有錯誤盲憎,請留言糾正)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市胳挎,隨后出現(xiàn)的幾起案子饼疙,更是在濱河造成了極大的恐慌,老刑警劉巖慕爬,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窑眯,死亡現(xiàn)場離奇詭異屏积,居然都是意外死亡,警方通過查閱死者的電腦和手機磅甩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門炊林,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人更胖,你說我怎么就攤上這事铛铁。” “怎么了却妨?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵饵逐,是天一觀的道長。 經(jīng)常有香客問我彪标,道長倍权,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任捞烟,我火速辦了婚禮薄声,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘题画。我一直安慰自己默辨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布苍息。 她就那樣靜靜地躺著缩幸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竞思。 梳的紋絲不亂的頭發(fā)上表谊,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音盖喷,去河邊找鬼爆办。 笑死,一個胖子當(dāng)著我的面吹牛课梳,可吹牛的內(nèi)容都是我干的距辆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼惦界,長吁一口氣:“原來是場噩夢啊……” “哼挑格!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沾歪,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎雾消,沒想到半個月后灾搏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挫望,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年狂窑,在試婚紗的時候發(fā)現(xiàn)自己被綠了媳板。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泉哈,死狀恐怖蛉幸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丛晦,我是刑警寧澤奕纫,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站烫沙,受9級特大地震影響匹层,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锌蓄,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一升筏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘸爽,春花似錦您访、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昼捍,卻和暖如春识虚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妒茬。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工担锤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乍钻。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓肛循,卻偏偏與公主長得像,于是被迫代替她去往敵國和親银择。 傳聞我的和親對象是個殘疾皇子多糠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評論 25 707
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單、最易理解的設(shè)計模式浩考,也因為它的簡潔易懂夹孔,是項目中最...
    成熱了閱讀 4,253評論 4 34
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,139評論 30 470
  • 1. Web標(biāo)準(zhǔn) Web標(biāo)準(zhǔn)由一系列標(biāo)準(zhǔn)組合而成搭伤,其核心理念就是將網(wǎng)頁的結(jié)構(gòu)只怎、樣式和行為分離開來,所以它可以分為三...
    Volcaner閱讀 2,100評論 0 0
  • 文/野草狂歡 我現(xiàn)在很羨慕20歲之前的“少不經(jīng)事” 其實也不是不經(jīng)事怜俐,只是這些事有人替你扛身堡。 1 2014年冬天,...
    荔枝321閱讀 347評論 2 2