(九)iOS開發(fā)之多線程—GCD單列模式

一.單列模式簡介

1.什么是單列模式秒际?

a.通過static關鍵詞呕缭,聲明全局變量疗垛。在整個進程運行期間只會被賦值一次

b.單列模式是一種常用的設計模式窜骄,一個類只有一個實例對象剩膘,且該類提供了便宜訪問的接口邦邦,創(chuàng)建的實例可以在程序中全局使用爪飘,用效的節(jié)約系統(tǒng)資源哆档。

2.單例模式的作用

可以保證在程序運行過程贺归,一個類只有一個實例淆两,而且該實例易于供外界訪問

從而方便地控制了實例個數,并節(jié)約系統(tǒng)資源

3.單例模式的使用場合

在整個應用程序中拂酣,共享一份資源(這份資源只需要創(chuàng)建初始化1次)

3.單例模式在ARC\MRC環(huán)境下的寫法有所不同秋冰,需要編寫2套不同的代碼

可以用宏判斷是否為ARC環(huán)境

#if __has_feature(objc_arc)

// ARC

#else

// MRC

#endif

二.單列模式的實現

1.ARC

a.GCD實現

// .h文件

#define TBBSingletonH + (instancetype)sharedInstance;

// .m文件

#define TBBSingletonM\

static id _instace; \

\

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

{ \

static dispatch_once_t onceToken; \

dispatch_once(&onceToken, ^{ \

_instace = [super allocWithZone:zone]; \

}); \

return _instace; \

} \

\

+ (instancetype)sharedInstance \

{ \

static dispatch_once_t onceToken; \

dispatch_once(&onceToken, ^{ \

_instace = [[self alloc] init]; \

}); \

return _instace; \

} \

\

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

{ \

return _instace; \

}

使用方法:只有在想設計為單列的類中.ht和.m文件中分別加入TBBSingletonH和TBBSingletonM即可

b.非GCD單列

#import

@interface TBBStu :NSObject

+ (instancetype)sharedInstance;

@end

#import“TBBStu.h"

@interface TBBStu()

@end

@implementation TBBStu

staticid_instance;

+ (instancetype)allocWithZone:(struct_NSZone*)zone

{

@synchronized(self) {

if(_instance==nil) {

_instance= [superallocWithZone:zone];

}

}

return_instance;

}

+ (instancetype)sharedInstance

{

@synchronized(self) {

if(_instance==nil) {

_instance= [[self alloc]init];

}

}

return_instance;

}

- (id)copyWithZone:(NSZone*)zone

{

return_instance;

}

@end

2.非ARC

非ARC中(MRC),單例模式的實現(比ARC多了幾個步驟)

實現內存管理方法

- (id)retain{returnself;}

- (NSUInteger)retainCount{return1; }

- (onewayvoid)release {}

- (id)autorelease{returnself; }

實現代碼:

//.h文件

#import

//單例方法

@interface TBBSingleton : NSObject

+ (instancetype)sharedSingleton;

@end

//.m文件

#import "TBBSingleton.h"

@implementation TBBSingleton

//全局變量

static id _instance = nil;

//單例方法

+(instancetype)sharedSingleton{

//系統(tǒng)的大多數類方法都有做autorelease踱葛,所以我們也需要做一下

return [[[self alloc] init] autorelease];

}

//alloc會調用allocWithZone:

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

//只進行一次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instance = [super allocWithZone:zone];

});

return _instance;

}

//初始化方法

-(instancetype)init{

// 只進行一次

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_instance = [super init];

});

return _instance;

}

- (oneway void)release{

//什么都不做 保證單例對象不被銷毀

}

//返回本身 保證只有一個單例對象

- (instancetype)retain{

return _instance;

}

//計數器為1 保證只有一個單例對象

- (NSUInteger)retainCount{

return 1;

}

//copy在底層 會調用copyWithZone:

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

return? _instance;

}

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

return _instance;

}

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

return _instance;

}

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

return _instance;

}

@end

注意:因為要保證單例對象在程序運行期間一直存在丹莲,所以不需要實現release方法和dealloc方法

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尸诽,隨后出現的幾起案子甥材,更是在濱河造成了極大的恐慌,老刑警劉巖性含,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件洲赵,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機叠萍,發(fā)現死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門芝发,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苛谷,你說我怎么就攤上這事辅鲸。” “怎么了腹殿?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵独悴,是天一觀的道長。 經常有香客問我锣尉,道長刻炒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任自沧,我火速辦了婚禮坟奥,結果婚禮上,老公的妹妹穿的比我還像新娘拇厢。我一直安慰自己爱谁,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布孝偎。 她就那樣靜靜地躺著管行,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邪媳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天荡陷,我揣著相機與錄音雨效,去河邊找鬼。 笑死废赞,一個胖子當著我的面吹牛徽龟,可吹牛的內容都是我干的。 我是一名探鬼主播唉地,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼据悔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耘沼?” 一聲冷哼從身側響起极颓,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎群嗤,沒想到半個月后菠隆,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年骇径,在試婚紗的時候發(fā)現自己被綠了躯肌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡破衔,死狀恐怖清女,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情晰筛,我是刑警寧澤嫡丙,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站传惠,受9級特大地震影響迄沫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜卦方,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一羊瘩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盼砍,春花似錦尘吗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至近刘,卻和暖如春擒贸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背觉渴。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工介劫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留案淋,地道東北人座韵。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像踢京,于是被迫代替她去往敵國和親誉碴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內容