作为预处理指令,#pragma
在编译时进行计算。但它并不像如#ifdef…#endif
之类的宏,#pragma
的使用方式不会改变你的应用运行时的行为。相反的,#pragma
声明主要由 Xcode 用来完成两个主要任务:整理代码
和防止编译器警告
。
一、整理代码
相信大家都用过 #pragma mark
来在划分代码模块,使代码更整洁、逻辑更清晰。例如:
@implementation ViewController
- (id)init {
...
}
#pragma mark - UIViewController
- (void)viewDidLoad {
...
}
#pragma mark - IBAction
- (IBAction)cancel:(id)sender {
...
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
...
}
#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
...
}
二、防止编译器警告
用#pragma
声明来防止来自编译器或者静态分析器的警告是我们平时比较少用的。使用的姿势是这样的:
// clang诊断push
#pragma clang diagnostic push
#pragma clang diagnostic 操作 "操作具体类型"
// clang诊断pop,如果不pop,下面写的代码,也会将undeclared selector识别为error
#pragma clang diagnostic pop
- 用法1: 将警告识别为错误
执行一些未实现的方法时, 避免出现unrecognized selector sent to instance 0x...
, 通过error
操作中的'-Wundeclared-selector'(找不到方法)将原始的警告变为错误:
1.1 方法未实现警告
1.2 方法未实现警告变错误
1.3 方法实现后错误消失
- 用法2: 忽略警告
同样对于1.1 方法未实现警告
的处理也可以采用ignored
忽略操作解除警告,但是未实现方法的情况下运行还是会崩溃, 此处只做使用说明:
ignored 忽略1.1的方法未实现警告
- 用法3: 忽略参数非空检查
当一些参数出现可为空、不可为空时的错误警告可以通过ignored
操作的'-Wnonnull'(忽略非空参数检查)来解除:
3.1 参数不为空时, 传递了nil之后的警告
3.2 忽略警告
实际上,clang diagnostic并不只有上面的两种固定用法
error
:警告识别为错误`
ignored
:忽略警告
还有很多其他的, 当然具体的操作类型也有很多, 比如常用的有:
-Warc-performSelector-leaks performSelector可能导致内存泄露
-Wundeclared-selector 找不到方法
-Wdeprecated-declarations 废弃的方法
-Wincompatible-pointer-types 指针类型不匹配
-Warc-retain-cycles Block的循环引用
-Wunused-variable 未使用的变量
进阶的话进去看看Clang 的git 文档
结语
路漫漫其修远兮,吾将上下而求索~
.End
网友评论