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