代码如下,可直接拷贝到头文件中
#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;
}
时间: 2024-11-06 20:25:31