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

Dav*_*fal 27 iphone xcode warnings suppress-warnings

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

我打电话:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
Run Code Online (Sandbox Code Playgroud)

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

但是,我收到一条警告,我正在调用一个已弃用的SDK.

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

这可以在Xcode中实现吗?

Gui*_*ume 76

对于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
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该被标记为正确的答案.它不那么hacky并且在编译时解决了这个问题,除了更清洁一点. (7认同)
  • 有关所有警告忽略字符串,请参见 [此处](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html)。 (2认同)

Wil*_*oss 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
Run Code Online (Sandbox Code Playgroud)

我不知道这是否适用于Clang,但它应该与GCC合作.

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


Geo*_*che 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];
Run Code Online (Sandbox Code Playgroud)

或者以较少容错的方式:

UIApplication *app = [UIApplication sharedApplication];
SEL sel = @selector(setStatusBarHidden:animated:);
IMP imp = [app methodForSelector:sel];
imp(app, sel, YES, YES);
Run Code Online (Sandbox Code Playgroud)