Macro -- 宏定义的使用场景

1.NS_UNAVAILABLE_XX

OS某个版本之后,方法、属性可用。在不支持的OS上运行时直接崩溃,提示unrecognized selector。

- (NSString *)methodOnSpecificalVers NS_AVAILABLE_IOS(10_0);

2.定义全局变量
比如获取导航栏、状态栏高度,判断机型进行UI适配等。这里使用物理像素判断全面屏机型,惊奇的发现,XS MSX 和 XR物理尺寸不一致,但是logical resolution却一致,都是 375 * 896 point。

#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#define STATUSBAR_HEIGHT [[UIApplication sharedApplication] statusBarFrame].size.height
#define NAVBAR_HEIGHT IPHONE_X ? 64 : 44
#define  STATUS_NAV_HEIGHT STATUSBAR_HEIGHT + NAVBAR_HEIGHT
#define IPHONE_X ([UIScreen mainScreen].nativeBounds.size.height == 2436.0 || [UIScreen mainScreen].nativeBounds.size.height == 1792.0 || [UIScreen mainScreen].nativeBounds.size.height == 2688.0)
 //

3.方法

 //单例
#define SINGLE_INSTANCE_OF(className)\
+ (instancetype)shared##className;

#define SINGLE_INSTANCE_IMP_OF(className)\
+ (instancetype)shared##className {\
static className *obj;\
static dispatch_once_t onceToken;\
dispatch_once(&onceToken, ^{\
    obj = [[className alloc] init];\
});\
return obj;\
}
 //断言
NSAssert(BOOL, @"");
//主线程安全
#define ASYN_MAIN(...) dispatch_async(dispatch_get_main_queue(), ^{__VA_ARGS__})
#define ASYN_BLOCK_ON_MAIN(block) dispatch_async(dispatch_get_main_queue(), block)

__VA_ARGS__(双下划线),表示多个变量
## 连接前后单词

4.__weak , __strong
为了解决block中的循环引用问题,需要用__weak,__strong修饰符重新定义变量。目前还是WS 与SS使用更方便些。

//autoreleasepool模式, 用法 @aweakify(self)
#define aweakify(obj) autoreleasepool{} __weak typeof(obj) weak_##obj = obj
#define astrongify(obj) autoreleasepool{} __strong typeof(weak_self) self = weak_self

//WS SS

#define weakify(obj) __weak typeof(obj) weak_##obj = obj
#define strongify(obj) __strong typeof(obj) strong_##obj = obj

#define WS weakify(self)
#define SS __strong typeof(weak_self) self = weak_self

宏定义在预处理阶段(Proprocessor)进行替换,可通过Process查看预处理结果。在预处理阶段时,通过词法分析,识别出#define,#import,#include, #pragma。

5.Preprocessor Macro VS Preprocessor Macro without precompiled file

这个是针对pch做的优化,限制你在pch使用某些宏定义。Preprocessor Macro哪都可以用,但是Preprocessor Macro without precompiled file 不能在pch中使用到。举个列子,我把TWITTER_APP_KEY=123 定义在了Preprocessor Macro without precompiled file中,然后在pch有如下逻辑

#ifdef TWITTER_APP_KEY
#define TWITTER_LOGIN_NAME @"twitter"  
#endif

相当于TWITTER_LOGIN_NAME根本没定义。不过为了优化编译,苹果已经推荐移除pch文件,如果你项目中没有,则忽略Preprocessor Macro without precompiled file就好。

6.未解之谜

#if DEBUG
NSLog(@"%d, %@", WECHAT_APP_KEY, WECHAT_LOGIN_NAME);
#endif

上述语句在执行完preprocess之后,并没有出现,是用clang -E也没有出现。怀疑Preprocess和assembly还是用的release configuration,但是我目前没找到在哪配置。。

Echo
Sun Feb 17, 2019

你可能感兴趣的:(Macro -- 宏定义的使用场景)