OC宏定义实现单例设计模式
2017-05-13 本文已影响0人
Jackson_Chan
单例设计模式是在开发中经常可以看到的一种设计模式,不管是在 Cocoa Touch框架还是我们自己的业务逻辑中都可以看到它的身影。
- 首先解答一个问题,什么是单例设计模式呢?
它可以保证在我们的 App 里面某个类创建出来的对象有且仅有一个。
- 首先解答一个问题,什么是单例设计模式呢?
- 其次为什么要使用单例设计模式,直接创建对象不行么?
1)这个要从单例设计模式的作用说起,在手持设备当中,内存的使用很多情况下都是要斤斤计较,单例设计模式可以保证在我们的 App 里面某个类创建出来的对象有且仅有一个,那么它的一个作用就是可以节省内存开销。
2)如果我们的 App 有一份数据,整个 App 到处都有可能使用到这份数据(比如登录的用户信息),只需要使用同一份数据(保证大家访问的数据是相同的,一致的)。
3)工具类一般都可以设计成单例设计模式。
- 其次为什么要使用单例设计模式,直接创建对象不行么?
- 下面直接上代码
#define JCSINGLETON_H(name) +(instancetype)share##name;
#if __has_feature(objc_arc)
//条件满足 ARC
#define JCSINGLETON_M(name) static id _instance;\
\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}
#else
//MRC
#define JCSINGLETON_M(name) static id _instance;\
+(instancetype)allocWithZone:(struct _NSZone *)zone\
{\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
_instance = [super allocWithZone:zone];\
});\
\
return _instance;\
}\
\
+(instancetype)share##name\
{\
return [[self alloc]init];\
}\
\
-(id)copyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
\
-(id)mutableCopyWithZone:(NSZone *)zone\
{\
return _instance;\
}\
-(oneway void)release\
{\
}\
\
-(instancetype)retain\
{\
return _instance;\
}\
\
-(NSUInteger)retainCount\
{\
return MAXFLOAT;\
}
#endif