将警告识别为错误
如果我们希望一个警告必须被修改掉,以保证程序的安全,我们可以将警告识别为错误,虽然xcode的设置中可以将警告全部识别为错误,但这样做根本毫无意义,很多三方库都或多或少存在一些警告,这会导致项目很难编译通过。
例:在项目中有些时候不得已需要通过Selector的方式执行方法的时候,又不想因为找不到Selector而导致unrecognized selector sent to instance
的崩溃问题,就可以将找不到的Selector识别为错误:
// clang诊断push
#pragma clang diagnostic push
// 将undeclared selector警告识别为error
#pragma clang diagnostic error "-Wundeclared-selector"
[self performSelector:@selector(noMethod) withObject:nil];
// clang诊断pop,如果不pop,下面写的代码,也会将undeclared selector识别为error
#pragma clang diagnostic pop
可以发现原本应该是警告的被识别为错误了:
忽略警告
同样如果我们希望一个警告在编译的时候,不被识别为警告,我们就可以对警告进行忽略,下面同样以undeclared selector警告为例:
#pragma clang diagnostic push
// 忽略undeclared selector的警告
#pragma clang diagnostic ignored "-Wundeclared-selector"
[self performSelector:@selector(noMethod) withObject:nil];
#pragma clang diagnostic pop
组合
实际上,clang diagnostic并不只有上面的两种固定用法,error:警告识别为错误
还是ignored:忽略警告
都可以根据自己的需求进行选择。
而警告的类型也不止-Wundeclared-selector:undeclared selector
一种,其他的比如:
-Wdeprecated-declarations 废弃的方法
-Wincompatible-pointer-types 指针类型不匹配
-Warc-retain-cycles Block的循环引用
-Wunused-variable 未使用的变量
如果上面这些都不是你想要的,下面来个全集吧:http://fuckingclangwarnings.com/
同样#pragma clang diagnostic
也可以写成#pragma GCC diagnostic
,clang和GCC都是前端编译器,不过clang是苹果专门为mac系统做的。