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;的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容