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

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

一、簡單說明:

設計模式:多年軟件開發,總結出來的一套經驗、方法和工具

java中有23種設計模式,在ios中最常用的是單例模式和代理模式。

二、單例模式說明

(1)單例模式的作用?:可以保證在程序運行過程,一個類只有一個實例,而且該實例易于供外界訪問,從而方便地控制了實例個數,并節約系統資源。

(2)單例模式的使用場合:在整個應用程序中,共享一份資源(這份資源只需要創建初始化1次),應該讓這個類創建出來的對象永遠只有一個。


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

可以用宏判斷是否為ARC環境

#if__has_feature(objc_arc)

//ARC

#else

//MRC

#endif

(4)在ARC中,單例模式的實現思路

在.m中保留一個全局的static的實例???static id _instance;

1)重寫allocWithZone:方法,在這里創建唯一的實例(注意線程安全)

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

2)提供1個類方法讓外界訪問唯一的實例

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


if(!_instance) {

_instance = [[self alloc] init];

}

}

return_instance;

}

3)實現copyWithZone:方法

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

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

實現內存管理方法

- (id)retain { return self; }

- (NSUInteger)retainCount { return 1; }

- (oneway void)release {}

- (id)autorelease { return self; }

三、單例模式(ARC)

1.說明

重寫allocWithzone:方法,控制內存分配。因為alloc內部會調用該方法,每次調用allocWithzone:方法,系統都會創建一塊新的內存空間。

alloc方法中:永遠只分配一次內存

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

2.代碼示例

創建一個音頻工具類,繼承子NSObject類。

在該類中實現以下代碼,觀察:

1//

2//YYAudioTool.m3

//06-單例模式

14//

#import"YYAudioTool.h"

10@interfaceYYAudioTool ()

11//用來保存mp3文件

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

13@end

14@implementationYYAudioTool

15//構造方法

16-(id)init

17{

18if(self=[super init]) {

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

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

22//self.muscis[@"1.mp3"]=1mp3數據;

23//self.muscis[@"2.mp3"]=2mp3數據;

25returnself;

28//兩個方法的調用

29+(id)alloc

30{

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

32return[super alloc];

33}

35//控制內存分配,每次調用allocWithzone:方法,系統都會創建一塊新的內存空間36+(id)allocWithZone:(struct_NSZone *)zone

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

39return[super allocWithZone:zone];

@end

在主控制器中,創建工具類對象:

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

打印結果:

說明:在alloc內部會調用更底層的方法allocWithZone方法分配內存空間,上面的代碼創建了四個不同的對象。

3.單例模式:設計思路

(1)永遠只分配一塊內存來創建對象

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

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

代碼示例:

創建一個音頻工具類,繼承子NSObject類。

在該類中按照設計思路實現以下代碼:

YYAudioTool.m文件

9#import"YYAudioTool.h"

10@interfaceYYAudioTool ()

11//用來保存mp3文件

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

13@end

15@implementationYYAudioTool

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

17staticid_instace;

18//單例模式:設計

19//(1)永遠只分配一塊內存來創建對象

20//(2)提供一個類方法,返回內部唯一的一個變量

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

23//構造方法

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數據;

35//self.muscis[@"2.mp3"]=2mp3數據;

36}

37});38self=obj;

40returnself;

41}

44//重寫該方法,控制內存的分配,永遠只分配一次存儲空間

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

46{

48//里面的代碼只會執行一次

49staticdispatch_once_t onceToken;

50dispatch_once(&onceToken, ^{

51_instace=[super allocWithZone:zone];

52});53return_instace;

54}

56//類方法

57+(id)sharedAudioTool

58{

59//里面的代碼永遠都只執行一次

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//提供一個類方法,返回內部唯一的一個變量5+(id)sharedAudioTool;6@end

主控制器中創建對象:

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

觀察打印結果:

說明:整個程序中只創建一個對象實例。

4.static補充:

注意:static id instace=nil;和static id instace;instace=nil;的區別

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容