我正在针对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中完成吗?
答案 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”
这将删除警告。
希望它会对你有所帮助。