iOS #pragma & #pragma clang diagnostic

作为预处理指令,#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 文档

结语

路漫漫其修远兮,吾将上下而求索~

作者

作者掘金

作者GitHub

.End

你可能感兴趣的:(iOS #pragma & #pragma clang diagnostic)