随着所有SDK的流动,能够构建多个SDK和平台非常方便。但是,从3.2到3.0甚至偶尔2.x反弹,我经常得到已弃用的警告,涉及已经改变或被取代的方法:
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
由于我仍然希望保持与旧操作系统的兼容性,并且我还在努力在构建时消除“噪音”,是否有办法关闭或禁用这些警告?
答案 0 :(得分:322)
由于我还无法在@samiq帖子中添加评论,我想我会扩展它。在使用弃用的东西的函数/方法之前输入提到的指令。然后,您可以在定义函数结束后恢复先前的设置:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma GCC diagnostic pop
答案 1 :(得分:139)
Clang提供了一个很好的功能,使@manicaesar帖子中的“恢复”步骤独立于初始警告状态:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma clang diagnostic pop
引用Clang manual:
除了GCC的pragma提供的所有功能外,Clang还允许您推送和弹出当前的警告状态。这在编写将由其他人编译的头文件时特别有用,因为您不知道他们构建了哪些警告标记。
答案 2 :(得分:76)
尝试-Wno-deprecated-declarations
或其在Xcode中的相应设置,GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS
(专业提示:只需在构建设置中输入“已弃用”即可找到此警告的具体设置。)
当前版本的Xcode(例如Xcode 9.2):
Xcode的古老版本(例如Xcode 2.x,3.x):
答案 3 :(得分:39)
由于我们倾向于需要支持旧的操作系统,但要注意我们的警告,我想要一个更整洁的方法来做到这一点。我把它放在一起,受到一些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之前的设备的支持时,您可以轻松搜索代码以查找要修复的弃用用法。
答案 4 :(得分:28)
答案 5 :(得分:15)
如果您想要警告实施弃用的方法或实施弃用的类,请使用:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" // code #pragma clang diagnostic pop
答案 6 :(得分:8)
答案 7 :(得分:1)
如果您希望对一段代码中的所有不赞成使用的内容进行全面检查。请使用 -Wdeprecated 标志,如下所示:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma clang diagnostic pop
答案 8 :(得分:-2)
要禁用第三方标题文件中的警告,请在文件顶部添加以下行
#pragma clang system_header