在Xcode中禁用特定行中的特定警告

时间:2010-06-29 02:12:10

标签: iphone xcode warnings suppress-warnings

我正在针对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 个答案:

答案 0 :(得分:74)

对于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

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

答案 1 :(得分: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合作。

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

答案 2 :(得分: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);

答案 3 :(得分:4)

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

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

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

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

这将删除警告。

希望它会对你有所帮助。