Xcode / iOS - 摆脱特定常量的弃用警告?

时间:2011-06-26 02:36:56

标签: objective-c xcode warnings deprecated

我的项目中有一些不赞成使用的常量。他们需要留下来。我不想被警告他们,但是如果其他已弃用的常量应该在我的项目中出现,我想要发出警告。

Apple的标题声明如下:

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

我怎样才能使警告静音?

使用已弃用的方法here静音警告的相关答案
有关不推荐使用的字符串转换警告的相关答案here

4 个答案:

答案 0 :(得分:24)

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

示例:您希望摆脱恼人的弃用警告,但仅针对[[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

确保在构建分发之前注释掉这一行。或者只是使用预处理器宏从发布版本中排除这些行。

答案 1 :(得分:2)

添加到编译器标志:

-Wno-deprecated-declarations

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

Warn About Deprecated Functions

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

答案 2 :(得分:1)

这个问题的正确答案是不要使用弃用的常量。检查文档以获取现在完成某些操作的建议方法。在弃用的方法/常量/无论如何,如果你愿意的话,几乎总是有一个链接到“替换”。改用它。这样你的代码永远不会神秘地消失,但你的用户仍然有一个针对旧的sdk构建的构建,现在他们的代码崩溃,或者更糟糕的是,做了奇怪的事情。

答案 3 :(得分:1)

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

我们的想法是声明一个具有相同方法的新协议(当然不会弃用)并将该对象强制转换为该协议。这样,您可以在不获取警告的情况下调用该方法,并且不会删除所有弃用警告。

例如:如果要在应用程序中集成TestFlight,SDK文档建议在BETA中传输设备的uniqueIdentifier。这有助于跟踪哪个测试人员遇到问题。 Apple不推荐使用此方法(并且他们不允许您提交应用),但我相信这是使用弃用方法的一个很好的示例。

在您的App代表中:

/* 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]];

    // ...
}