Xcode/iOS--如何消除特定常量的弃用警告?

7

我的项目中有一些已弃用的常量,它们需要保留。我不想收到关于这些常量的警告,但如果将来我的项目中出现其他已弃用的常量,我希望能收到警告。

苹果公司的头文件声明如下:

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

我该如何消除警告?
关于消除过时方法的警告,可以参考这里:这里
关于消除过时字符串转换警告,可以参考这里:这里
4个回答

24

我知道这是一个旧话题,但今天我也碰到了同样的烦恼。

例如:你想摆脱令人讨厌的“弃用警告”,但只针对 [[UIDevice currentDevice] uniqueIdentifier]],因为你很可能想在使用 TestFlight 进行开发阶段时使用它。 如果您错误地使用其他已弃用的声明,仍需要编译器提醒您。

我喜欢sarfata的答案:它能够完成工作。 但是还有一种更加“政治正确”的方法可用:

以下方法来自The Goo Software Blog

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

在构建发布版之前,请确保注释掉这些行。或者简单地使用预处理器宏来从发布版本中排除这些行。


2

添加到编译器标志:

-Wno-deprecated-declarations

或者在Xcode中,选择“否”作为构建设置选项:
Warn About Deprecated Functions

如果你查看构建输出(在Xcode 4中按Apple+7),你会注意到前面提到的编译器标志。


1

这是谷歌搜索排名第一的答案,我相信在某些情况下使用已弃用的方法是有用的,例如当您想要避免警告以保持构建“干净”时。此解决方案的灵感来自:http://vgable.com/blog/2009/06/15/ignoring-just-one-deprecated-warning/

思路是声明一个具有相同方法(但当然不是已弃用的)的新协议,并将对象转换为该协议。这样,您可以调用该方法而不会得到警告,并且无需摆脱所有已弃用的警告。

例如:如果您想将TestFlight集成到应用程序中,SDK文档建议在测试版中传输设备的唯一标识符。这可以帮助跟踪哪个测试人员遇到了问题。尽管苹果已经弃用了此方法(并且他们不会让您提交应用程序),但我认为这是使用已弃用的方法的好例子。

在您的App Delegate中:

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

    // ...
}

问题是关于常量的。 - William Jockusch
确实...很抱歉。它仍然是我谷歌搜索结果中的第一项。可能会对某些人有所帮助。不过还是感谢您的反馈。 - sarfata
+1:不错 :) 我仍然会使用这个方法 - Rok Jarc

1
这个问题的正确答案是不要使用已弃用的常量。查看文档以了解现在推荐的完成方式。对于已弃用的方法/常量/任何内容,几乎总会有一个指向“替代品”的链接。请使用该链接。这样,当它们永远消失时,您的代码不会神秘地崩溃,但您的用户仍然可以构建旧SDK版本,并且现在他们的代码会崩溃或更糟糕的是出现奇怪的行为。

6
我必须使用常量,因为早期版本的iOS没有不被弃用的常量。我会检查非弃用常量是否存在,并在可用时使用它。否则,我就得退而求其次使用已弃用的常量。苹果公司的示例代码也是这样做的。 - William Jockusch
有多早?别告诉我你还是支持3.x的人之一?根据大多数人的说法,少于2%的用户正在运行iOS 3.x(这也包括iPad用户),而实际上不到40%的用户拥有可以运行iOS 3.x的设备。 - jer
2
一个很好的例子是dismissModalViewControllerAnimated:。这在iOS 6.0 API中已经被弃用,但替代方法只在iOS 5 API中引入。由于编译时需要使用iOS 6 API才能提交与iPhone 5兼容的应用程序,因此您必须忽略这些警告或停止支持iOS 4.x(这相当严厉)。 - BadPirate
尽管这样做可能有些过于强硬,但大多数运行ios4的用户都在armv6设备上(跨所有我的应用程序,约占所有用户的4%(摊销)中的88%)。这些用户无法运行ios6,因此我认为支持ios4似乎相当愚蠢。 - jer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接