oc快速生成单例头文件解析
// .h文件 #define WLSingletonH(name) + (instancetype)shared##name; // .m文件 #if __has_feature(objc_arc) #define WLSingletonM(name) \ static id _instace; \ \ + (id)allocWithZone:(struct _NSZone *)zone \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instace = [super allocWithZone:zone]; \ }); \ return _instace; \ } \ \ + (instancetype)shared##name \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instace = [[self alloc] init]; \ }); \ return _instace; \ } \ \ - (id)copyWithZone:(NSZone *)zone \ { \ return _instace; \ } #else #define WLSingletonM(name) \ static id _instace; \ \ + (id)allocWithZone:(struct _NSZone *)zone \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instace = [super allocWithZone:zone]; \ }); \ return _instace; \ } \ \ + (instancetype)shared##name \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instace = [[self alloc] init]; \ }); \ return _instace; \ } \ \ - (id)copyWithZone:(NSZone *)zone \ { \ return _instace; \ } \ \ - (oneway void)release { } \ - (id)retain { return self; } \ - (NSUInteger)retainCount { return 1;} \ - (id)autorelease { return self;} #endif
##可以直接连接宏中的参数
如果一条宏太长,以至于一行放不下,就需要在每行的结尾加一个‘\’,表示下一行属于这条宏,和一行中放不下一条
字符串一样
要在arc和mrc模式下都能使用,就需要用预处理宏判断一下
#if __has_feature(objc_arc)
这里放置arc模式下的单例宏
#else
这里放置非arc模式下的单例宏