【问题标题】:Xcode/iOS -- get rid of deprecation warnings for specific constants?Xcode/iOS——摆脱特定常量的弃用警告?
【发布时间】:2011-09-22 20:00:29
【问题描述】:

我的项目中有一些已弃用的常量。他们需要留下来。我不想收到有关它们的警告,但如果以后在我的项目中出现其他不推荐使用的常量,我确实希望收到警告。

Apple 的标头声明它们如下:

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

如何使警告静音?

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

【问题讨论】:

    标签: objective-c xcode warnings deprecated


    【解决方案1】:

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

    示例:您想摆脱烦人的弃用警告,但只针对[[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
    

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

    【讨论】:

      【解决方案2】:

      添加到编译器标志:

      -Wno-deprecated-declarations
      

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

      Warn About Deprecated Functions
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我必须使用常量,因为早期版本的 iOS 没有非弃用的。我确实检查了未弃用的是否存在,并在可用时使用它。否则,我必须依靠已弃用的常量。 Apple 的示例代码也是这样做的。
        • 多早?不要告诉我你是仍然支持 3.x 的人之一?根据大多数人的统计,只有不到 2% 的用户正在运行 iOS 3.x(这也包括 iPad 用户),而实际上只有不到 40% 的用户拥有CAN RUN iOS 3.x跨度>
        • 很好的例子是dismissModalViewControllerAnimated:这在iOS 6.0 API 中已被弃用,但替代方案仅在iOS 5 API 中引入。由于提交与 iPhone 5 兼容的应用程序需要使用 iOS 6 API 进行编译,因此您必须忽略这些警告或停止支持 iOS 4.x(这是相当严厉的)
        • 尽管手头很重,但大多数运行 ios4 的用户碰巧在 armv6 设备上(我所有应用程序中所有用户的 4% 中约有 88%(摊销))。那些用户无法运行 ios6,因此支持 ios4 似乎很傻 imo。
        【解决方案4】:

        这是 google 中的#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]];
        
            // ...
        }
        

        【讨论】:

        • 问题是关于常量的。
        • 确实......对此感到抱歉。它仍然在我的谷歌搜索中排名第一。可能会帮助某人。不过感谢您的反馈。
        • +1: 好一个 :) 我还是会使用this recipe
        猜你喜欢
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 2020-01-27
        • 1970-01-01
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多