141

由于所有 SDK 都随处可见,因此能够为多个 SDK 和平台构建非常方便。但是,从 3.2 跳到 3.0,甚至偶尔跳到 2.x,我经常收到涉及已更改或被取代的方法的弃用警告:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

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

4

9 回答 9

342

由于我还不能对@samiq 帖子添加评论,我想我会扩展它。在使用不推荐使用的东西的函数/方法之前输入提到的指令。然后可以在函数结束定义后恢复之前的设置:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma GCC diagnostic pop
于 2010-11-09T11:34:56.183 回答
149

Clang 提供了一个很好的功能,它使@manicaesar 帖子中的“恢复”步骤独立于初始警告状态:

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

引用 Clang手册

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

于 2012-11-14T20:36:26.400 回答
85

Try -Wno-deprecated-declarations,或其在 Xcode 中的相应设置,GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS(专业提示:只需在构建设置中输入“deprecated”即可找到此警告的具体设置)。

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

在此处输入图像描述


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

在此处输入图像描述

于 2010-04-12T12:36:29.027 回答
47

由于我们往往需要支持较旧的操作系统,但请注意我们的警告,我想要一种更整洁的方式来做到这一点。受一些 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 之前的设备的支持时,您可以轻松地搜索代码以找到要修复的弃用用法。

于 2014-10-25T16:41:21.077 回答
29

您还可以通过使用来抑制每个文件的警告

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

这反过来使它比仅仅一次和一次地抑制所有警告更好一点……毕竟你知道你在做什么。

于 2010-07-26T09:17:32.500 回答
23

如果您想消除警告Implementing deprecated methodImplementing deprecated class,请使用:

    #pragma clang 诊断推送
    #pragma clang 诊断忽略“-Wdeprecated-implementations”
    // 代码
    #pragma clang 诊断弹出

于 2018-04-20T10:55:04.090 回答
8

在您的构建设置中,找到Deprecated Functions.

在此处输入图像描述

于 2016-09-27T22:42:15.913 回答
5

如果您想全面检查一段代码中的各种弃用。请使用-Wdeprecated标志,如下所示:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop
于 2018-12-17T03:33:46.677 回答
-3

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

#pragma clang system_header
于 2014-02-03T22:36:04.260 回答