在Xcode中抑制弃用的警告

随着所有SDK的漂移,能够为多个SDK和平台构build方便。 但是,从3.2到3.0甚至偶尔2.x,我经常会得到不合时宜的警告,涉及到已经改变或被取代的方法:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated. 

由于我仍然希望保持与较老的操作系统的兼容性,并且在构build时还努力去除“噪音”,是否有办法closures或禁用这些警告?

尝试-Wno-deprecated-declarations ,或在Xcode中的相应设置, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS

在这里输入图像说明

由于我还不能添加评论@samiq文章,我想我会扩大它。 在使用弃用的东西的函数/方法之前input提到的指令。 然后你可以在函数结束定义之后恢复以前的设置:

 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - (void) methodUsingDeprecatedStuff { //use deprecated stuff } #pragma GCC diagnostic pop 

铿锵提供了一个很好的function,使@manicaesarpost中的“恢复”步骤独立于初始警告状态:

 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - (void) methodUsingDeprecatedStuff { //use deprecated stuff } #pragma clang diagnostic pop 

引用Clang 手册 :

除了GCC的编译指示提供的所有function外,Clang还允许您推送和popup当前的警告状态。 这在编写由其他人编译的头文件时特别有用,因为您不知道他们使用哪个警告标志。

由于我们倾向于需要支持较老的操作系统,但要注意我们的警告,我想要一个更加整洁的方式来做到这一点。 我把它放在一起,受到一些Mozilla代码的启发:

 #define SILENCE_DEPRECATION(expr) \ do { \ _Pragma("clang diagnostic push") \ _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ expr; \ _Pragma("clang diagnostic pop") \ } while(0) #define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr) #define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr) 

这使您可以执行以下操作:

 SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]); 

它也适用于代码块:

 SILENCE_IOS7_DEPRECATION( view = [[MKPolylineView alloc] initWithPolyline:self]; view.lineWidth = self.lineWidth; view.strokeColor = self.color; ); 

此外,当您放弃对iOS 7之前的设备的支持时,您可以轻松地search代码以查找不合适的用法来修复。

您也可以通过使用禁止每个文件的警告

 #pragma GCC diagnostic ignored "-Wdeprecated-declarations" 

这反过来使它有点更好的做法,而不是只是一次又一次地压制所有的警告……毕竟你知道你在做什么。

在您的构build设置中,findDeprecated Functions

在这里输入图像说明

要禁用来自第三方头文件的警告,请在文件顶部添加以下行

 #pragma clang system_header