代码如下,可直接拷贝到头文件中
#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;
}