随着所有SDK的漂移,可以方便地为多个SDK和平台构建。然而,反弹从3.2到3.0,甚至偶尔2.X,我经常得到涉及方法过时的警告,已经修改或取代:抑制Xcode中不推荐使用的警告
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
因为我还是希望保持与旧的操作系统的兼容性,和我在建筑时也努力去除“噪音”,是否有办法关闭或禁用这些警告?
随着所有SDK的漂移,可以方便地为多个SDK和平台构建。然而,反弹从3.2到3.0,甚至偶尔2.X,我经常得到涉及方法过时的警告,已经修改或取代:抑制Xcode中不推荐使用的警告
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
因为我还是希望保持与旧的操作系统的兼容性,和我在建筑时也努力去除“噪音”,是否有办法关闭或禁用这些警告?
尝试-Wno-deprecated-declarations
,或其在Xcode中的相应设置,GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS
(专业提示:只需在构建设置中输入“deprecated”即可找到此警告的特定设置)。
当前的Xcode的版本(如Xcode中9.2):
古代版本的Xcode(如Xcode的2.X,3.X):
您还可以通过使用
来抑制每个文件的警告这反过来使它有点更好的做法,而不仅仅是压制所有的警告一次和一起...毕竟你知道你在做什么。
Upvoted ...像魅力一样工作 – NSPratik 2016-09-26 06:47:28
由于我还不能添加评论@samiq文章,我想我会扩大它。在您使用弃用的东西的函数/方法之前输入提到的指令。
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma GCC diagnostic pop
锵提供了一个很好的功能,使“恢复”,在@manicaesar独立后的最初警告状态的步骤:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma clang diagnostic pop
然后您可以将功能结束后定义恢复以前的设置
引述锵manual:
除了所有的海湾合作委员会的编译所提供的功能,锵,您还可以推送和弹出当前的警告州。这在编写由其他人编译的头文件时特别有用,因为您不知道它们使用何种警告标志。
更新版本的GCC使用相同的语法(GCC的替代clang)。 – Niclas 2014-01-27 14:04:59
我总是对LLVM,GCC和Clang感到困惑。所以,我想放下笔记以节省时间。 GNU编译器集合(GCC)与Xcode 3一起使用,然后Apple发布了带有混合LLVM-GCC的Xcode 4。然后,低级虚拟机(LLVM)编译器接手了,请参阅http://llvm.org上的更多信息。从Xcode 7.2.1开始,默认编译器是Apple LLVM 7.0。 LLVM编译器是其他“项目”,调试器和其他工具的库,其中包括Clang本机编译器。 Clang是“LLVM原生”C/C++/Objective-C编译器。 – 2016-02-15 17:31:32
要禁用来自第三方的头文件警告,在文件的顶部
#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;
);
而且,当你放弃对iOS 7之前的设备的支持时,你可以轻松地搜索代码来找到不合适的用法来修复。
对于大多数代码而言,这是一个更好的长期解决方案,而不是在全球/项目级别缩减弃用(或任何其他)警告。了不起的答案。 – natbro 2014-10-25 20:38:29
这是解决这个常见问题的一种非常性感的方式。我感谢你的努力。 – 2015-05-13 02:47:22
作为参考,这可以用于任何铛选项...我个人使用它('-Wdeprecated-declarations')并禁用performSelector泄漏警告('-WperformSelector-leaks')。您只需在第二个'_Pragma'调用中相应地更改选项。 – 2015-07-14 14:27:18
虽然保罗的r答案的作品,认为manicaesar是多一点的手术,因为它可以让您精确地抑制你想要的警告,又不失其他额外的警告,这可能是非常重要的。在我看来,就最佳实践而言,manicaesar拥有The Correct Answer™ – Olie 2013-01-18 04:23:35