iOS开发-单例模式


iOS开发—单例模式 

一、简单说明:
设计模式:多年软件开发,总结出来的一套经验、方法和工具
 
二、单例模式说明
(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     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     _instance = [super allocWithZone:zone];
26     return _instance;
27 }
28 
29 +(void)load{
30     _instance = [[self alloc]init];
31 }
32 
33 +(instancetype)shareAudioTool{
34     return _instance;
35 }
36 
37 +(instancetype)copyWithZone:(struct _NSZone *)zone{
38     return _instance;
39 }
40 
41 +(instancetype)mutableCopyWithZone:(struct _NSZone *)zone{
42     return _instance;
43 }
44 
45 -(instancetype)copyWithZone:(struct _NSZone *)zone{
46     return _instance;
47 }
48 
49 -(instancetype)mutableCopyWithZone:(struct _NSZone *)zone{
50     return _instance;
51 }
52 
53 @end

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM