iOS開發(fā)多線程篇—單例模式(ARC)

iOS開發(fā)多線程篇—單例模式(ARC)

一、簡單說明:

設(shè)計(jì)模式:多年軟件開發(fā)哎媚,總結(jié)出來的一套經(jīng)驗(yàn)蒙挑、方法和工具

java中有23種設(shè)計(jì)模式幼东,在ios中最常用的是單例模式和代理模式确镊。

二士骤、單例模式說明

(1)單例模式的作用?:可以保證在程序運(yùn)行過程,一個(gè)類只有一個(gè)實(shí)例蕾域,而且該實(shí)例易于供外界訪問拷肌,從而方便地控制了實(shí)例個(gè)數(shù),并節(jié)約系統(tǒng)資源旨巷。

(2)單例模式的使用場合:在整個(gè)應(yīng)用程序中廓块,共享一份資源(這份資源只需要?jiǎng)?chuàng)建初始化1次),應(yīng)該讓這個(gè)類創(chuàng)建出來的對(duì)象永遠(yuǎn)只有一個(gè)契沫。


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

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

#if__has_feature(objc_arc)

//ARC

#else

//MRC

#endif

(4)在ARC中昔汉,單例模式的實(shí)現(xiàn)思路

在.m中保留一個(gè)全局的static的實(shí)例???static id _instance;

1)重寫allocWithZone:方法懈万,在這里創(chuàng)建唯一的實(shí)例(注意線程安全)

1+ (id)allocWithZone:(struct_NSZone *)zone2{? ? @synchronized(self) {3if(!_instance) {4_instance = [super allocWithZone:zone];5}6}7return_instance;8}

2)提供1個(gè)類方法讓外界訪問唯一的實(shí)例

+ (instancetype)sharedSoundTool2{3@synchronized(self) {


if(!_instance) {

_instance = [[self alloc] init];

}

}

return_instance;

}

3)實(shí)現(xiàn)copyWithZone:方法

1+ (id)copyWithZone:(struct_NSZone *)zone2{3return_instance;4}

(5)非ARC中(MRC)拴清,單例模式的實(shí)現(xiàn)(比ARC多了幾個(gè)步驟)

實(shí)現(xiàn)內(nèi)存管理方法

- (id)retain { return self; }

- (NSUInteger)retainCount { return 1; }

- (oneway void)release {}

- (id)autorelease { return self; }

三、單例模式(ARC)

1.說明

重寫allocWithzone:方法会通,控制內(nèi)存分配口予。因?yàn)閍lloc內(nèi)部會(huì)調(diào)用該方法,每次調(diào)用allocWithzone:方法涕侈,系統(tǒng)都會(huì)創(chuàng)建一塊新的內(nèi)存空間沪停。

alloc方法中:永遠(yuǎn)只分配一次內(nèi)存

init方法中:保證所有的MP3數(shù)據(jù)都只加載一次。

2.代碼示例

創(chuàng)建一個(gè)音頻工具類裳涛,繼承子NSObject類木张。

在該類中實(shí)現(xiàn)以下代碼,觀察:

1//

2//YYAudioTool.m3

//06-單例模式

14//

#import"YYAudioTool.h"

10@interfaceYYAudioTool ()

11//用來保存mp3文件

12@property(nonatomic,strong)NSMutableDictionary *muscis;

13@end

14@implementationYYAudioTool

15//構(gòu)造方法

16-(id)init

17{

18if(self=[super init]) {

19//加載所需的音樂資源

21//self.muscis=[NSMutableDictionary dictionary];

22//self.muscis[@"1.mp3"]=1mp3數(shù)據(jù)端三;

23//self.muscis[@"2.mp3"]=2mp3數(shù)據(jù);

25returnself;

28//兩個(gè)方法的調(diào)用

29+(id)alloc

30{

31NSLog(@"alloc----");

32return[super alloc];

33}

35//控制內(nèi)存分配,每次調(diào)用allocWithzone:方法舷礼,系統(tǒng)都會(huì)創(chuàng)建一塊新的內(nèi)存空間36+(id)allocWithZone:(struct_NSZone *)zone

37{38NSLog(@"allocWithZone---");

39return[super allocWithZone:zone];

@end

在主控制器中,創(chuàng)建工具類對(duì)象:

2//YYViewController.m

3//06-單例模式

14//

5//Created by apple on 14-6-25.

6//Copyright (c) 2014年 itcase. All rights reserved.

7//#import"YYViewController.h"

10#import"YYAudioTool.h"

12@interfaceYYViewController ()

14@end

16@implementationYYViewController

18- (void)viewDidLoad

{20[super viewDidLoad];

21YYAudioTool *tool1=[[YYAudioTool alloc]init];

22YYAudioTool *tool2=[[YYAudioTool alloc]init];

23YYAudioTool *tool3=[[YYAudioTool alloc]init];

24YYAudioTool *tool4=[[YYAudioTool alloc]init];

25NSLog(@"%p--%p--%p--%p",tool1,tool2,tool3,tool4);

26}

28@end

打印結(jié)果:

說明:在alloc內(nèi)部會(huì)調(diào)用更底層的方法allocWithZone方法分配內(nèi)存空間郊闯,上面的代碼創(chuàng)建了四個(gè)不同的對(duì)象妻献。

3.單例模式:設(shè)計(jì)思路

(1)永遠(yuǎn)只分配一塊內(nèi)存來創(chuàng)建對(duì)象

(2)提供一個(gè)類方法,返回內(nèi)部唯一的一個(gè)變量

(3)最好保證init方法也只初始化一次

代碼示例:

創(chuàng)建一個(gè)音頻工具類团赁,繼承子NSObject類育拨。

在該類中按照設(shè)計(jì)思路實(shí)現(xiàn)以下代碼:

YYAudioTool.m文件

9#import"YYAudioTool.h"

10@interfaceYYAudioTool ()

11//用來保存mp3文件

12@property(nonatomic,strong)NSMutableDictionary *muscis;

13@end

15@implementationYYAudioTool

16//定義一份變量(整個(gè)程序運(yùn)行過程中,只有一份)

17staticid_instace;

18//單例模式:設(shè)計(jì)

19//(1)永遠(yuǎn)只分配一塊內(nèi)存來創(chuàng)建對(duì)象

20//(2)提供一個(gè)類方法欢摄,返回內(nèi)部唯一的一個(gè)變量

21//(3)最好保證init方法也只初始化一次

23//構(gòu)造方法

24-(id)init

25{

26//__block id obj=nil;

27staticidobj=nil;

28staticdispatch_once_t onceToken;

29dispatch_once(&onceToken, ^{

30if((obj=[super init]) != nil) {

31//加載所需的音樂資源

32//....

33//self.muscis=[NSMutableDictionary dictionary];

34//self.muscis[@"1.mp3"]=1mp3數(shù)據(jù)熬丧;

35//self.muscis[@"2.mp3"]=2mp3數(shù)據(jù);

36}

37});38self=obj;

40returnself;

41}

44//重寫該方法,控制內(nèi)存的分配剧浸,永遠(yuǎn)只分配一次存儲(chǔ)空間

45+(id)allocWithZone:(struct_NSZone *)zone

46{

48//里面的代碼只會(huì)執(zhí)行一次

49staticdispatch_once_t onceToken;

50dispatch_once(&onceToken, ^{

51_instace=[super allocWithZone:zone];

52});53return_instace;

54}

56//類方法

57+(id)sharedAudioTool

58{

59//里面的代碼永遠(yuǎn)都只執(zhí)行一次

60staticdispatch_once_t onceToken;

61dispatch_once(&onceToken, ^{

62_instace=[[self alloc]init];

63});

64return_instace;

65}

67+(id)copyWithZone:(struct_NSZone *)zone

68{69return_instace;70}71@end

YYAudioTool.h文件

1#import23@interfaceYYAudioTool : NSObject4//提供一個(gè)類方法锹引,返回內(nèi)部唯一的一個(gè)變量5+(id)sharedAudioTool;6@end

主控制器中創(chuàng)建對(duì)象:

1//

2//YYViewController.m

3//06-單例模式1

9#import"YYViewController.h"

10#import"YYAudioTool.h"

12@interfaceYYViewController ()

14@end

16@implementationYYViewController

18- (void)viewDidLoad

{20[super viewDidLoad];

21//YYAudioTool *tool1=[[YYAudioTool alloc]init];

22//YYAudioTool *tool2=[[YYAudioTool alloc]init];

23YYAudioTool *tool1=[YYAudioTool sharedAudioTool];

24YYAudioTool *tool2=[YYAudioTool sharedAudioTool];

25YYAudioTool *tool3=[[YYAudioTool alloc]init];

26YYAudioTool *tool4=[[YYAudioTool alloc]init];

27NSLog(@"%p--%p--%p--%p",tool1,tool2,tool3,tool4);

}

30@end

觀察打印結(jié)果:

說明:整個(gè)程序中只創(chuàng)建一個(gè)對(duì)象實(shí)例。

4.static補(bǔ)充:

注意:static id instace=nil;和static id instace唆香;instace=nil;的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫌变,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子躬它,更是在濱河造成了極大的恐慌腾啥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冯吓,死亡現(xiàn)場離奇詭異倘待,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)组贺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門凸舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人失尖,你說我怎么就攤上這事啊奄〗ニ眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵菇夸,是天一觀的道長琼富。 經(jīng)常有香客問我,道長庄新,這世上最難降的妖魔是什么鞠眉? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮择诈,結(jié)果婚禮上械蹋,老公的妹妹穿的比我還像新娘。我一直安慰自己吭从,他們只是感情好朝蜘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涩金,像睡著了一般谱醇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上步做,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天副渴,我揣著相機(jī)與錄音,去河邊找鬼全度。 笑死煮剧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的将鸵。 我是一名探鬼主播勉盅,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼顶掉!你這毒婦竟也來了草娜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤痒筒,失蹤者是張志新(化名)和其女友劉穎宰闰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體簿透,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡移袍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了老充。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葡盗。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖啡浊,靈堂內(nèi)的尸體忽然破棺而出戳粒,到底是詐尸還是另有隱情路狮,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布蔚约,位于F島的核電站,受9級(jí)特大地震影響涂籽,放射性物質(zhì)發(fā)生泄漏苹祟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一评雌、第九天 我趴在偏房一處隱蔽的房頂上張望树枫。 院中可真熱鬧,春花似錦景东、人聲如沸砂轻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽搔涝。三九已至,卻和暖如春和措,著一層夾襖步出監(jiān)牢的瞬間庄呈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國打工派阱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诬留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓贫母,卻偏偏與公主長得像文兑,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腺劣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 單例模式 什么是單例模式绿贞? 單例模式想一個(gè)大獨(dú)裁者,他規(guī)定在他的國度里面誓酒,所有數(shù)據(jù)的訪問和請(qǐng)求都得經(jīng)過他樟蠕,甚至你要...
    GitHubPorter閱讀 1,148評(píng)論 0 4
  • 一. ARC環(huán)境下的單例模式 單例模式的基本概念單例, 顧名思義, 即在整個(gè)程序中, 某一個(gè)類只有唯一一個(gè)實(shí)例, ...
    面糊閱讀 749評(píng)論 0 50
  • 線程間的通信 從子線程回到主線程 延時(shí)執(zhí)行 iOS常見的延時(shí)執(zhí)行有兩種方式p 調(diào)用NSObject的方法 p 使用...
    一抹月光3053閱讀 747評(píng)論 1 12
  • “我已經(jīng)用了洪荒之力了”這句話已經(jīng)紅遍大江南北寨辩,在網(wǎng)上廣泛流傳。但是在投資界也有這么一門獨(dú)門絕技歼冰,能夠讓你事半功倍...
    誠匯通閱讀 277評(píng)論 0 0
  • 初中隔嫡,也就十三四歲的時(shí)候吧甸怕。我戀上一張陽光燦爛的臉甘穿,那張臉展開的笑容能融化整個(gè)世界,后來梢杭,那張臉模糊了温兼,但陽光還在...
    老娜年方十八閱讀 278評(píng)論 0 4