30

我正在针对 Base 4.0 SDK 编写一个 iPhone 应用程序,但我的目标是 OS 3.1.3,因此 OS 3 用户可以使用该应用程序。

我打电话:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];

在 iOS 4.0 中已弃用。我知道这一点,如果我们在 iOS 4.0 或更高版本下运行,我已经采取措施调用更新的“withAnimation”版本。

但是,我收到警告说我正在调用已弃用的 SDK。

我想在这个特定的地方禁用这个特定的警告。我想要所有其他警告(包括其他位置的相同已弃用警告)

这可以在 Xcode 中完成吗?

4

4 回答 4

80

对于 CLANG,这有效:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  // Here I like to leave a comment to my future self to explain why I need this deprecated call
  NSString *myUDID = [[UIDevice currentDevice] uniqueIdentifier];
#pragma clang diagnostic pop

您可以在方法中使用它,这使您可以非常具体地了解导致您想要忽略的警告的行。

于 2012-07-22T13:41:19.377 回答
19

您也许可以使用 GCC 编译指示。这应该禁用封闭函数的弃用警告。

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated"
-(void)foo{
    // As Georg Fritzsche notes below, the pragmas only work outside of functions
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
}
#pragma GCC diagnostic pop

我不知道这是否适用于 Clang,但它应该适用于 GCC。

基本上,它保存警告/错误的状态,禁用已弃用的警告,编译函数,然后恢复诊断状态。

于 2010-06-29T03:04:35.290 回答
8

您可以使用NSInvocation独立于使用的编译器来绕过警告:

UIApplication *app = [UIApplication sharedApplication];
SEL sel = @selector(setStatusBarHidden:animated:);
NSMethodSignature *sig = [app methodSignatureForSelector:sel];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
BOOL b = YES;
[inv setTarget:app];
[inv setSelector:sel];
[inv setArgument:&b atIndex:2];
[inv setArgument:&b atIndex:3];
[inv invoke];

或者以一种容错性较低的方式:

UIApplication *app = [UIApplication sharedApplication];
SEL sel = @selector(setStatusBarHidden:animated:);
IMP imp = [app methodForSelector:sel];
imp(app, sel, YES, YES);
于 2010-06-29T20:26:21.343 回答
4

您可以像这样执行它以立即克服警告

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

或者

只需在每次使用已弃用的东西之前粘贴此行以避免警告

#pragma GCC 诊断警告“-Wdeprecated-declarations”

这将删除警告。

希望它会帮助你。

于 2012-03-14T03:59:38.977 回答