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
宏定义在预处理阶段进行替换,可通过Process查看预处理结果。
Echo
Sun Feb 17, 2019
网友评论