你的位置:首页 > 操作系统

[操作系统]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;

}