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ū)別