由于所有 SDK 都随处可见,因此能够为多个 SDK 和平台构建非常方便。但是,从 3.2 跳到 3.0,甚至偶尔跳到 2.x,我经常收到涉及已更改或被取代的方法的弃用警告:
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
由于我仍然想保持与旧操作系统的兼容性,并且我也在努力在构建时消除“噪音”,有没有办法关闭或禁用这些警告?
由于我还不能对@samiq 帖子添加评论,我想我会扩展它。在使用不推荐使用的东西的函数/方法之前输入提到的指令。然后可以在函数结束定义后恢复之前的设置:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma GCC diagnostic pop
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 还允许您推送和弹出当前警告状态。这在编写将由其他人编译的头文件时特别有用,因为您不知道他们使用什么警告标志构建。
由于我们往往需要支持较旧的操作系统,但请注意我们的警告,我想要一种更整洁的方式来做到这一点。受一些 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 之前的设备的支持时,您可以轻松地搜索代码以找到要修复的弃用用法。
您还可以通过使用来抑制每个文件的警告
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
这反过来使它比仅仅一次和一次地抑制所有警告更好一点……毕竟你知道你在做什么。
如果您想消除警告Implementing deprecated method或Implementing deprecated class,请使用:
#pragma clang 诊断推送 #pragma clang 诊断忽略“-Wdeprecated-implementations” // 代码 #pragma clang 诊断弹出
如果您想全面检查一段代码中的各种弃用。请使用-Wdeprecated标志,如下所示:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma clang diagnostic pop
要禁用来自第三方头文件的警告,请在文件顶部添加以下行
#pragma clang system_header