iOS开发之自定义一个单例
iOS开发之自定义一个单例
这里我使用宏:
// .h
#define single_interface(class) + (class *)shared##class;
// .m
// \ 代表下一行也属于宏
// ## 是分隔符
- #define single_implementation(class) \
- static class *_instance; \
- \
- + (class *)shared##class \
- { \
- if (_instance == nil) { \
- _instance = [[self alloc] init]; \
- } \
- return _instance; \
- } \
- \
- + (id)allocWithZone:(NSZone *)zone \
- { \
- static dispatch_once_t onceToken; \
- dispatch_once(&onceToken, ^{ \
- _instance = [super allocWithZone:zone]; \
- }); \
- return _instance; \
- }
//单例模式在ARC\MRC环境下的写法有所不同,需要编写2套不同的代码
#if __has_feature(objc_arc)
//ARC
//重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)
- + (id)allocWithZone:(struct _NSZone *)zone
- {
- @synchronized(self) {
- if (!_instance) {
- _instance = [super allocWithZone:zone];
- }
- }
- return _instance;
- }
- //提供1个类方法让外界访问唯一的实例
- + (instancetype)shareInstance
- {
- @synchronized(self) {
- if (!_instance) {
- _instance = [[self alloc] init];
- }
- }
- return _instance;
- }
- //实现copyWithZone:方法
- + (id)copyWithZone:(struct _NSZone *)zone
- {
- return _instance;
- }
#else
//非ARC
//非ARC中(MRC),单例模式的实现(比ARC多了几个步骤)
//重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)
- + (id)allocWithZone:(struct _NSZone *)zone
- { @synchronized(self) {
- if (!_instance) {
- _instance = [super allocWithZone:zone];
- }
- }
- return _instance;
- }
- //提供1个类方法让外界访问唯一的实例
- + (instancetype)shareInstance
- {
- @synchronized(self) {
- if (!_instance) {
- _instance = [[self alloc] init];
- }
- }
- return _instance;
- }
- //实现copyWithZone:方法
- + (id)copyWithZone:(struct _NSZone *)zone
- {
- return _instance;
- }
- //实现内存管理方法
- - (id)retain
- {
- return self;
- }
- - (NSUInteger)retainCount
- {
- return 1;
- }
- - (oneway void)release
- {
- }
- - (id)autorelease
- {
- return self;
- }
#endif
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。