首页 > 代码库 > 单例模式
单例模式
单例模式
单例模式的作用
可以保证程序运行过程,一个类只有一个实例,而且该实例易于供外界访问。
从而方便的控制了实例个数,节约了系统资源。
单例模式的使用场合
在整个应用程序中,共享一份资源(这份资源只需要创建初始化一次)。
单例模式在ARC/MRC环境下的写法有所不同,需要编写两套不同的代码。
可以用宏判断是否为ARC环境
#if __has_feature(objc_arc)
//ARC
#else
//MRC
#endif
单例模式 - ARC
ARC中,单例模式的实现
在.m中保留一个全局的static的实例
static id _instance;
重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)
+ (id)allocWithZone:(struct _NSZone *)zone
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [super allocWithZone:zone];
});
return _instance;
}
提供一个类方法让外界访问唯一的实例
+ (instancetype)shareAudioTool
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[CZAudioTool alloc] init];
});
return _instance;
}
//实现copyWithZone:方法
- (id)copyWithZone:(NSZone *)zone
{
return _instance;
}
单例模式-非ARC
非ARC(MRC),单例模式的实现比ARC模式下多了几个步骤
实现内存管理方法
- (id)retain{ return self;}
- (NSUInteger)retainCount{ return UINT_MAX;}
- (oneway void)release{}
- (id)autorelease {return self;}
如何通过宏定义定义单例
/** MRC版本请粘贴以下代码 #if !__has_feature(objc_arc) - (oneway void)release {} - (id)retain { return _instance; } - (id)autorelease { return _instance; } - (NSUInteger)retainCount { return UINT_MAX; } #endif */// 接口定义#define singletonInterface(className) + (instancetype)shared##className;// 实现定义// 在定义宏时 \ 可以用来拼接字符串#define singletonImplementation(className) static className *_instance; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [super allocWithZone:zone]; }); return _instance; } + (instancetype)shared##className { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[self alloc] init]; }); return _instance; } - (id)copyWithZone:(NSZone *)zone { return _instance; }
单例模式