我们首先要搞清楚的是:作为预处理指令,#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 mark十分主流,但是另一方面,用#pragma声明来防止来自编译器或者静态分析器的警告是我们平时比较少用的。使用的姿势是这样的:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-需要忽略的命令"
// 可能会报警的代码。
#pragma clang diagnostic pop
常见的使用有:
1,忽略参数非空检查(”-Wnonnull”),我们的头文件这样定义:
-(instancetype _Nullable)initWithUrl:(NSString *_Nonnull)url param:(NSDictionary *_Nullable)param NS_DESIGNATED_INITIALIZER;
在我们的实现文件中,累的初始化方法:
- (instancetype)init{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
return [self initWithUrl:nil param:nil];
#pragma clang diagnostic pop
}
2,方法弃用告警(”-Wdeprecated-declarations”)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
[TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]];
#pragma clang diagnostic pop
其他还有一些不太常用的选项,大家可参考:
http://blog.youkuaiyun.com/a466468841/article/details/50751503