ARC和MRC实现单例模式
代码如下,可直接拷贝到头文件中
#define singleton_h(name) +(instancetype)shared##name # if __has_feature(objc_arc) //ARC #define singleton_m(name) \ static id _instance;\ +(id)allocWithZone:(struct _NSZone *)zone\ {\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ _instance = [super allocWithZone:zone];\ });\ return _instance;\ }\ \ +(instancetype)shared##name\ {\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ _instance = [[self alloc] init];\ });\ return _instance;\ }\ \ +(id)copyWithZone:(struct _NSZone *)zone\ {\ return _instance;\ } #else //非ARC #define singleton_m(name) \ static id _instance;\ +(id)allocWithZone:(struct _NSZone *)zone\ {\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ _instance = [super allocWithZone:zone];\ });\ return _instance;\ }\ \ +(instancetype)shared##name\ {\ static dispatch_once_t onceToken;\ dispatch_once(&onceToken, ^{\ _instance = [[self alloc] init];\ });\ return _instance;\ }\ \ +(id)copyWithZone:(struct _NSZone *)zone\ {\ return _instance;\ }\ -(oneway void)release\ {\ \ }\ -(instancetype)autorelease\ {\ return _instance;\ }\ -(instancetype)retain\ {\ return _instance;\ }\ -(NSUInteger)retainCount\ {\ return 1;\ } #endif
MRC要重写四个方法:
-(oneway void)release
{
}
-(instancetype)autorelease
{
return self;
}
-(instancetype)retain{
return self;
}
-(NSUInteger)retainCount{
return 1;
}