条件编码,单例头文件,自动适配ARC和MRC

network | | 访问(41)
#if __has_feature(objc_arc)
    // 编译器是ARC环境
#else
    // 编译器是MRC环境
#endif
}

OC快速生成单例头文件解析

// .h文件
#define HMSingletonH(name) + (instancetype)shared##name;

// .m文件 ARC
#if __has_feature(objc_arc)

    #define HMSingletonM(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 // MRC

    #define HMSingletonM(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模式下的单例宏