压制 Xcode 反对的警告

随着所有 SDK 的流动,能够为多个 SDK 和平台构建非常方便。然而,从3.2跳到3.0,甚至偶尔跳到2.x,我经常收到涉及已经更改或被取代的方法的不推荐的警告:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

由于我仍然想保持与旧版操作系统的兼容性,而且我也在努力消除构建时的“噪音”,有没有办法关闭或禁用这些警告?

73648 次浏览

尝试使用 -Wno-deprecated-declarations,或者它在 Xcode 的对应设置 GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(专业提示: 只要在构建设置中输入“不推荐”,就可以找到这个警告的特定设置)。

Xcode 的当前版本(例如 Xcode 9.2) :

enter image description here


Xcode 的古老版本(例如 Xcode 2.x,3.x) :

enter image description here

还可以使用

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

这反过来使它成为一个更好的做法,而不是只是压制所有的警告一次和一起... 毕竟你得知道你在做什么。

因为我还不能给@samiq 添加评论,我想我会扩展它。在使用不推荐的内容的函数/方法之前输入上述指令。然后,您可以在函数结束的定义之后恢复以前的设置:

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

Clang 提供了一个很好的特性,使得@manicesar 文章中的“恢复”步骤独立于初始警告状态:

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

引用 Clang 手动操作的话:

除了 GCC 杂注提供的所有功能之外,Clang 还允许您推送和弹出当前的警告状态。这在编写将由其他人编译的头文件时特别有用,因为您不知道他们使用什么警告标志来构建头文件。

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

#pragma clang system_header

因为我们倾向于支持较老的操作系统,但是要注意我们的警告,所以我想要一个更整洁的方法来做到这一点。我受到 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;
);

此外,当您放弃对前 iOS7设备的支持时,您可以轻松地搜索代码,找到要修复的不推荐用法。

在构建设置中,找到 Deprecated Functions

enter image description here

如果要使警告 实现弃用方法实现弃用类静音,请使用:



#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
// code
#pragma clang diagnostic pop


如果您希望在一段代码中全面检查所有类型的弃用。请使用如下 我们反对标志:

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