iOS底层

iOS #pragma & #pragma clang diag

2022-04-02  本文已影响0人  下班不写程序

作为预处理指令,#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.1 方法未实现警告
1.2 方法未实现警告变错误
1.3 方法实现后错误消失
ignored 忽略1.1的方法未实现警告
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

上一篇下一篇

猜你喜欢

热点阅读