由于所有的SDK都随处可见,因此能够为多个SDK和平台进行构建非常方便。但是,从3.2跳到3.0甚至偶尔是2.x,我经常不建议使用警告,这些警告涉及已更改或被取代的方法:
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
由于我仍然想保持与旧操作系统的兼容性,并且我还在努力构建时消除“噪音”,因此有没有办法关闭或禁用这些警告?
由于所有的SDK都随处可见,因此能够为多个SDK和平台进行构建非常方便。但是,从3.2跳到3.0甚至偶尔是2.x,我经常不建议使用警告,这些警告涉及已更改或被取代的方法:
warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.
由于我仍然想保持与旧操作系统的兼容性,并且我还在努力构建时消除“噪音”,因此有没有办法关闭或禁用这些警告?
Answers:
尝试-Wno-deprecated-declarations
使用Xcode或Xcode中的相应设置GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS
(提示:只需在构建设置中键入“不赞成使用”即可找到此警告的特定设置)。
Xcode的当前版本(例如Xcode 9.2):
Xcode的古代版本(例如Xcode 2.x,3.x):
由于我还无法在@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" .. .. Code here .. .. #pragma GCC diagnostic pop
因为此方法可以使您回到之前设置的任何设置。[ gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html]
Clang提供了一个很好的功能,使@manicaesar帖子中的“恢复”步骤独立于初始警告状态:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
//use deprecated stuff
}
#pragma clang diagnostic pop
引用Clang 手册:
除了GCC编译指示提供的所有功能外,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);
必需的?
do{...}while(0);
在这里特别说明为什么要这样做?为什么不只是{...}
呢?为什么不if(true){...}
呢?等