2010-06-29 202 views
25

我正在编写针对Base 4.0 SDK的iPhone应用程序,但我的目标是OS 3.1.3,因此OS 3用户可以使用该应用程序。在Xcode中禁用特定行中的特定警告

我打电话:

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

它在iOS的4.0弃用。我意识到这一点,并且如果我们在iOS 4.0或更高版本下运行,并且已经采取措施调用更新的“withAnimation”版本。

但是,我收到一条警告,称我打算使用弃用的SDK。

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

这可以在Xcode中完成吗?

回答

71

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

你可以使用它的方法,它可以让你非常具体的关于使你想要的警告忽略了线内。

+0

这很好,谢谢 – elsurudo 2013-02-10 19:53:39

+7

这应该真的被标记为正确的答案。它不那么晦涩,并且在编译时解决了这个问题,除了更清洁一点。 – 2013-06-04 02:27:27

+0

正确使用铿锵+1,这应该是答案,NSInvocation是一个破解 – 2013-08-28 19:27:23

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 

我不知道这是否会与铛工作,但它应该 GCC工作。

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

+1

这些编译指示不允许在函数内部使用,它们必须包含一些辅助函数。 – 2010-06-29 20:29:09

+0

谢谢。这实际上并没有工作。它看起来像'推'和'流行'关键字是无效的,因为他们产生了自己的警告。 – 2010-06-29 23:34:07

+0

这里没有效果。 – Jonny 2013-04-21 05:06:26

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); 
+1

可以用[[UIApplication sharedApplication] methodSignatureForSelector:@selector(setStatusBarHidden)]来替换'[NSMethodSignature signatureWithObjCTypes:“v @ cc”]',以便于阅读? – 2010-06-29 20:40:38

+0

当然是的。 – 2010-06-29 21:19:22

+0

作品。谢谢。 – 2010-06-29 23:37:35

4

你可以这样执行它克服立即发出警告

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

使用过时的东西,每次来避免警告

的#pragma GCC诊断警告“-Wdeprecated-声明”

这将删除的警告之前,只需粘贴这一行。

希望它能帮助你。