2010-04-12 61 views
117

随着所有SDK的漂移,可以方便地为多个SDK和平台构建。然而,反弹从3.2到3.0,甚至偶尔2.X,我经常得到涉及方法过时的警告,已经修改或取代:抑制Xcode中不推荐使用的警告

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated. 

因为我还是希望保持与旧的操作系统的兼容性,和我在建筑时也努力去除“噪音”,是否有办法关闭或禁用这些警告?

+3

虽然保罗的r答案的作品,认为manicaesar是多一点的手术,因为它可以让您精确地抑制你想要的警告,又不失其他额外的警告,这可能是非常重要的。在我看来,就最佳实践而言,manicaesar拥有The Correct Answer™ – Olie 2013-01-18 04:23:35

回答

67

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

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

​​


古代版本的Xcode(如Xcode的2.X,3.X):

enter image description here

+17

发现它比这更容易; Xcode目标设置中有一个复选框;你的回答促使我在那里搜索。谢谢! – 2010-04-12 14:20:22

+2

你也可以在每个文件的基础上做到这一点。看到这个答案添加每个文件标志:http://stackoverflow.com/a/6658549/272473 – mrwalker 2012-09-07 20:08:54

+4

这样的答案令人沮丧的newbs。尝试在哪里?我如何找到目标设置?多一点解释会增加这个答案的价值。 – noogrub 2012-10-14 11:36:33

25

您还可以通过使用

来抑制每个文件的警告

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

+0

Upvoted ...像魅力一样工作 – NSPratik 2016-09-26 06:47:28

300

由于我还不能添加评论@samiq文章,我想我会扩大它。在您使用弃用的东西的函数/方法之前输入提到的指令。

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

非常棒!这就是我正在寻找+1 :) – 2011-01-02 04:16:51

+1

真棒小费!太糟糕了,它不能在方法中声明。 – Dustin 2011-05-24 16:16:28

+12

其实它可以在方法中声明。由于文档/ sdk中的一个错误,我今天只需要执行+1 – jer 2012-07-22 20:49:28

131

锵提供了一个很好的功能,使“恢复”,在@manicaesar独立后的最初警告状态的步骤:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
- (void) methodUsingDeprecatedStuff { 
    //use deprecated stuff 
} 
#pragma clang diagnostic pop 
然后您可以将功能结束后定义恢复以前的设置

引述锵manual

除了所有的海湾合作委员会的编译所提供的功能,锵,您还可以推送和弹出当前的警告州。这在编写由其他人编译的头文件时特别有用,因为您不知道它们使用何种警告标志。

+1

更新版本的GCC使用相同的语法(GCC的替代clang)。 – Niclas 2014-01-27 14:04:59

+2

我总是对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

-2

要禁用来自第三方的头文件警告,在文件的顶部

#pragma clang system_header 
36

因为我们往往需要支持旧的操作系统,但要注意我们的警告,我想添加以下行更完整的方式来做到这一点。我把这个在一起,通过一些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之前的设备的支持时,你可以轻松地搜索代码来找到不合适的用法来修复。

+0

对于大多数代码而言,这是一个更好的长期解决方案,而不是在全球/项目级别缩减弃用(或任何其他)警告。了不起的答案。 – natbro 2014-10-25 20:38:29

+0

这是解决这个常见问题的一种非常性感的方式。我感谢你的努力。 – 2015-05-13 02:47:22

+0

作为参考,这可以用于任何铛选项...我个人使用它('-Wdeprecated-declarations')并禁用performSelector泄漏警告('-WperformSelector-leaks')。您只需在第二个'_Pragma'调用中相应地更改选项。 – 2015-07-14 14:27:18

5

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

enter image description here