- 系统的宏
- 在这两个宏之间的代码,所有简单指针对象都被假定为
nonnull
不为空,因此我们只需要去指定那些nullable
可以为空的指针 -
2个宏的简述
NS_ASSUME_NONNULL_BEGIN ....代码.... NS_ASSUME_NONNULL_END
- 在这两个宏之间的代码,所有简单指针对象都被假定为
- 条件编译
-
define
宏定义 -
ifdef :
就是if define
-
ifndef:
就是if not define
-
#define HUHLog(...) NSLog(__VA_ARGS__)
-
(...)
- 可以变化的参数表 -
__VA_ARGS__
- 保留名,传什么过来,我就是什么。
-
-
- 自定义打印
- 为什么要替换系统的
NSLog
?- 未发布时,开发者需要看
NSLog 信息
。
发布后用户并不需要看NSLog 信息
, 所以需要注释掉,避免浪费性能。 - 替换掉系统
NSLog
,可以方便"启用/关闭NSLog
的功能。
- 未发布时,开发者需要看
- 思路:
- 判断是否为
DEBUG模式
, (App是否发布) - 是,使用自定义的打印
- 否,关闭
- 判断是否为
- 示例代码:
#ifdef DEBUG #define HUHLog(...) NSLog(__VA_ARGS__) #else #define HUHLog(...) //NSLog(__VA_ARGS__) #endif
- 为什么要替换系统的
- 过滤语言
- 每一个OC文件都会定义一个
__OBJC__
宏,只要判断有没有定义这样一个宏,就能看出是不是OC语言的文件.#ifdef __OBJC__ 代码块 #endif
- 每一个OC文件都会定义一个
- 适配 iPhone X的宏
-- 适配 iPhone X #define kSCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width) #define kSCREEN_HEIGHT ([UIScreen mainScreen].bounds.size.height) #define isIPhoneX (kSCREEN_WIDTH == 375.f && kSCREEN_HEIGHT == 812.f) -- 导航栏高度 #define MANavBarHeight isIPhoneX ? 88 : 64 --底部Tabbar 高度 #define MATabBarHeight isIPhoneX ? 83 : 49 --状态栏高度 #define MAStatusBarHeight isIPhoneX ? 44 : 20
- 屏幕的宽和高
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width) #define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
- iOS开发中遇到相同的打印相同的方法,在输出日志中无法辨别这个输出到底来自哪个类,这时就可以用到自定义打印了。
#define DLog(fmt, ...) NSLog((@"[%s[line:%d]] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
- (void)viewDidLoad { [super viewDidLoad]; NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil]; DLog(@"array:%@",array); }
[-[WDWAudioViewControll viewDidLoad][line:70]] array:( 1, 2, 3, 4, 5 ) WDWAudioViewControll是类名,viewDidLoad方法名,70是行数