2011-06-26 36 views
6

我的项目中有一些不推荐的常量。他们需要留下来。我不想被警告,但是如果其他不赞成使用的常量稍后会出现在我的项目中,则需要警告。Xcode/iOS - 摆脱特定常量的弃用警告?

苹果的头部声明它们如下:

extern NSString * const NameOfStringConstant __OSX_AVAILABLE_BUT_DEPRECATED(version availability info here) 

我怎么能沉默的警告?

沉默警告的方法已过时here
相关答案沉默有关弃用的字符串转换here

回答

1

正确回答这个问题的警告相关答案是不使用过时的常量。查看文档以获得推荐的方式来完成一些事情。在不推荐使用的方法/常量/其他方面,如果您愿意的话,几乎总是有一个“替换”的链接。改为使用它。这样,当这些代码永远消失时,你的代码并不会神秘地破裂,但是你的用户仍然有一个针对旧的sdk构建的构建,现在他们的代码崩溃了,或者更糟糕的是,它们会发生奇怪的事情。

+6

我必须使用这些常量,因为早期版本的iOS没有不推荐使用的常量。我会检查是否存在未弃用的存在,并在可用的情况下使用它。否则,我不得不退回不推荐使用的常量。 Apple的示例代码也是这样做的。 –

+0

有多早?不要告诉我你是支持3.x的人之一吗?根据大多数人的帐户,只有不到2%的用户使用iOS 3.x(同样也是iPad用户),而实际上有不到40%的用户使用* CAN RUN * iOS 3.x – jer

+1

在4.0中引入 –

2

添加到编译器标志:

-Wno-deprecated-declarations 

,或者在Xcode中,选择“否”,为构建设置选项:

Warn About Deprecated Functions 

,然后如果你看一下编译输出(苹果在Xcode 4中+7),你会注意到前面提到的编译器标志。

1

这是#1在谷歌的答案,我相信有一些不公平的情况下使用不推荐的方法是有用的,当你想避免警告,以保持构建“干净”。这个解决方案的灵感来自于:http://vgable.com/blog/2009/06/15/ignoring-just-one-deprecated-warning/

这个想法是声明一个新的协议,它具有相同的方法(当然不会弃用),并将该对象转换为该协议。通过这种方式,您可以调用该方法而不会收到警告,也无需清除所有弃用警告。

例如:如果您想在应用程序中集成TestFlight,则SDK文档建议在BETA中传输设备的uniqueIdentifier。这可以帮助追踪哪个测试者有问题。此方法已被Apple弃用(他们不会让您提交应用程序),但我相信这是使用不推荐方法的一个很好的示例。

在应用程序委托:

/* This is to avoid a warning when calling uniqueIdentifier for TestFlight */ 
@protocol UIDeviceHack <NSObject> 

- (NSString*) uniqueIdentifier; 

@end 


@implementation MyAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [TestFlight takeOff:@"Your-Testflight-team-id"]; 
    // TODO: Remove this in production (forbidden APIs) - Used here to improve beta reporting. 
    [TestFlight setDeviceIdentifier:[(id<UIDeviceHack>)[UIDevice currentDevice] uniqueIdentifier]]; 

    // ... 
} 
+0

问题是关于常量。 –

+0

确实......对不起。它仍然在我的谷歌搜索中第一次出现。可能帮助某人。感谢您的反馈。 – sarfata

+0

+1:很好:)我仍然会使用[这个配方](http://blog.goosoftware.co.uk/2012/04/18/unique-identifier-no-warnings/) –

23

我知道这是一个老话题,但今天,我正在处理相同的烦恼。

示例:您希望摆脱恼人的弃用警告,但仅适用于[[UIDevice currentDevice] uniqueIdentifier]],因为您很可能想在TestFlight的开发阶段使用它。 如果您错误地使用了一些其他弃用的声明,您仍然希望编译器警告您。

我喜欢sarfata's answer:它的工作。但还有更多政治正确可用方式:

以下配方取自The Goo Software Blog

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wdeprecated-declarations" 
    [TestFlight setDeviceIdentifier:[[UIDevice currentDevice] uniqueIdentifier]]; 
#pragma clang diagnostic pop 

确保你在建立分配之前注释掉这行。或者只需使用预处理器宏从发布版本中排除此行。