随着各种SDK的出现,能够为多个SDK和平台构建应用程序非常方便。然而,从3.2到3.0甚至偶尔到2.x的跳转中,我经常会收到有关已更改或被取代的方法的弃用警告:
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
由于我仍然希望与旧操作系统保持兼容性,并且在构建时也在努力消除“噪音”,是否有一种方法可以关闭或禁用这些警告?
随着各种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
#pragma GCC diagnostics push
#pragma GCC diagnostics ignored "-Wdeprecated-declarations"
.. .. 在这里写代码 .. ..
#pragma GCC diagnostic pop
这种方法会将你恢复到之前的设置状态。更多信息请参考:[http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html] - NiclasClang提供了一个不错的特性,使得@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之前的设备时,您可以轻松搜索代码以查找需要修复的已弃用用法。
do {...} while(0)
? - Ky -do{...}while(0);
吗?为什么不只用 {...}
?为什么不用 if(true){...}
等等。 - Ky - 来对每个文件抑制警告。#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
这反过来比仅仅一次抑制所有警告更好的实践方式稍微好一些......毕竟你得知道自己在做什么。
如果您想消除警告实现弃用的方法 或 实现弃用的类,请使用以下代码:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-implementations" // 代码 #pragma clang diagnostic pop
如果您想对一段代码进行所有种类的过时检查,请使用以下命令:-Wdeprecated:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma clang diagnostic pop
要禁用第三方头文件的警告,请在文件顶部添加以下行:
#pragma clang system_header