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;的区别
网友评论