码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发-单例模式

时间:2016-06-12 18:16:48      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

iOS开发—单例模式(ARC) 

一、简单说明:
设计模式:多年软件开发,总结出来的一套经验、方法和工具
 
二、单例模式说明
(1)单例模式的作用 :可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问,从而方便地控制了实例个数,并节约系统资源。
(2)单例模式的使用场合:在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),应该让这个类创建出来的对象永远只有一个。 
 
三.设计思路 
(1)永远只分配一块内存来创建对象
(2)提供一个类方法,返回内部唯一的一个变量
(3)最好保证init方法也只初始化一次 
 
四、 代码示例
1 #import <Foundation/Foundation.h>
2 
3 @interface YXAudioTool : NSObject
4 
5 +(instancetype)shareAudioTool;
6 
7 @end

 

 1 #import "YXAudioTool.h"
 2 
 3 @interface YXAudioTool()
 4 
 5 //@property (nonatomic,strong) NSMutableDictionary * muscis;
 6 
 7 @end
 8 
 9 @implementation YXAudioTool
10 
11 static id _instance;
12 
13 - (instancetype)init
14 {
15     static dispatch_once_t onceToken;
16     dispatch_once(&onceToken, ^{
17         if ((self == [super init])) {
18             //加载所需音乐资源
19         }
20     });
21     return self;
22 }
23 
24 +(instancetype)allocWithZone:(struct _NSZone *)zone{
25     static dispatch_once_t onceToken;
26     dispatch_once(&onceToken, ^{
27         _instance = [super allocWithZone:zone];
28     });
29     return _instance;
30 }
31 
32 +(instancetype)shareAudioTool{
33     static dispatch_once_t onceToken;
34     dispatch_once(&onceToken, ^{
35         _instance = [[self alloc]init];
36     });
37     return _instance;
38 }
39 
40 +(instancetype)copyWithZone:(struct _NSZone *)zone{
41     return _instance;
42 }
43 
44 +(instancetype)mutableCopyWithZone:(struct _NSZone *)zone{
45     return _instance;
46 }
47 
48 -(instancetype)copyWithZone:(struct _NSZone *)zone{
49     return _instance;
50 }
51 
52 -(instancetype)mutableCopyWithZone:(struct _NSZone *)zone{
53     return _instance;
54 }
55 
56 @end

 
五、说明
重写allocWithzone:方法,控制内存分配。因为alloc内部会调用该方法,每次调用allocWithzone:方法,系统都会创建一块新的内存空间。
alloc方法中:永远只分配一次内存
init方法中:保证所有的MP3数据都只加载一次。 
使用dispatch_once一次性代码,整个程序运行过程中,只会执行一次。默认是线程安全的
 
6、扩展
单例模式又可分为懒汉模式和恶汉模式
上面展示的是我们最常见的懒汉模式
另一种模式:恶汉模式
当类加载到OC运行时环境中(内存),就会调用+(void)load一次(一个类只会加载一次)
恶汉模式是线程安全的,因为虚拟机保证只会装载一次,在装载类的时候是不会发生并发的。
 
 1 #import "YXAudioTool.h"
 2 
 3 @interface YXAudioTool()
 4 
 5 //@property (nonatomic,strong) NSMutableDictionary * muscis;
 6 
 7 @end
 8 
 9 @implementation YXAudioTool
10 
11 static id _instance;
12 
13 - (instancetype)init
14 {
15     self = [super init];
16     if (self) {
17          //加载所需音乐资源
18     }
19     return self;
20 }
21 
22 +(instancetype)allocWithZone:(struct _NSZone *)zone{
23     _instance = [super allocWithZone:zone];
24     return _instance;
25 }
26 
27 +(void)load{
28     _instance = [[self alloc]init];
29 }
30 
31 +(instancetype)shareAudioTool{
32     return _instance;
33 }
34 
35 +(instancetype)copyWithZone:(struct _NSZone *)zone{
36     return _instance;
37 }
38 
39 +(instancetype)mutableCopyWithZone:(struct _NSZone *)zone{
40     return _instance;
41 }
42 
43 -(instancetype)copyWithZone:(struct _NSZone *)zone{
44     return _instance;
45 }
46 
47 -(instancetype)mutableCopyWithZone:(struct _NSZone *)zone{
48     return _instance;
49 }

 

 

iOS开发-单例模式

标签:

原文地址:http://www.cnblogs.com/tiankongdjiban/p/5578276.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!