將警告識別為錯誤
??如果我們希望一個警告必須被修改掉,以保證程序的安全,我們可以將警告識別為錯誤,雖然xcode的設置中可以將警告全部識別為錯誤,但這樣做根本毫無意義,很多三方庫都或多或少存在一些警告,這會導致項目很難編譯通過。
??例:在項目中有些時候不得已需要通過Selector的方式執(zhí)行方法的時候,又不想因為找不到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
??可以發(fā)現(xiàn)原本應該是警告的被識別為錯誤了:

忽略警告
??同樣如果我們希望一個警告在編譯的時候,不被識別為警告,我們就可以對警告進行忽略,下面同樣以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:忽略警告都可以根據(jù)自己的需求進行選擇。
??而警告的類型也不止-Wundeclared-selector:undeclared selector一種,其他的比如:
-Wdeprecated-declarations 廢棄的方法
-Wincompatible-pointer-types 指針類型不匹配
-Warc-retain-cycles Block的循環(huán)引用
-Wunused-variable 未使用的變量
??如果上面這些都不是你想要的,下面來個全集吧:http://fuckingclangwarnings.com/
??同樣#pragma clang diagnostic也可以寫成#pragma GCC diagnostic,clang和GCC都是前端編譯器,不過clang是蘋果專門為mac系統(tǒng)做的。