Xcode中的弃用警告以及如何处理弃用警告

16
if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
     {[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];} //post-iOS6.0
else {[self dismissModalViewControllerAnimated:YES];} //pre-iOS6.0

我正在使用respondsToSelector(上面)代码处理弃用的方法。这样我的应用程序就可以与旧版iOS兼容,但是我在代码中收到警告:“'dismissModalViewControllerAnimated:'已过时:在iOS 6.0中首次过时。”

我个人不喜欢在代码中出现任何警告,但更重要的是,我在某个地方读到过,苹果公司会抱怨你的代码中出现警告。

1)苹果公司会抱怨你代码中出现警告吗?

2)我的处理被弃用的方法的方法正确吗?

3)有没有办法关闭被弃用方法的警告?


2
顺便提一句 - 苹果不会对你代码中的警告发牢骚。除非你给他们发送一条消息并告诉他们,否则他们无法知道是否存在任何警告(如果有)。 - rmaddy
很好的回答,但我的问题更多是关于在类似情况下该怎么做的一般性问题?我想要支持至少1或2个版本,所以在这种情况下你是正确的,但其他需要同时支持两个版本的情况怎么办?你会如何处理?就像我上面说的那样,保留警告吗? - ConfusedDeer
2
只要方法在您选择的“部署目标”之前没有被弃用,您将不会收到任何弃用警告。如果该方法在您的“部署目标”之前已被弃用,则根本不应尝试使用该弃用方法。因此实际上需要处理的内容很少。 - rmaddy
@rmaddy +1 同意,但如果编写类时考虑到重用性,您可能事先不知道部署目标是什么。话虽如此,在这种情况下我可能会基于__IPHONE_OS_VERSION_MIN_REQUIRED#if逻辑,而不是抑制警告。 - Rob
3个回答

20
  1. 苹果不知道您的代码是否存在编译时警告。

  2. 是的,您正在正确地处理这种情况。很明显,在这种情况下,只有在支持 iOS 5.0 之前的版本时才需要进行此操作。但是,总体来说,测试方法是否可调用并调用相应的实现的技巧是完全正确的。

  3. 如果您想关闭警告,您可以简单地暂时禁止警告,然后使用适当的#pragma语法将其打开:

if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
{
    //post-iOS6.0
    [self dismissViewControllerAnimated:YES completion:nil];
} 
else
{
    // pre-iOS6.0
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [self dismissModalViewControllerAnimated:YES];
#pragma clang diagnostic pop
}
顺便提一下,如果您想知道特定警告的-W代码是什么,可以前往您的日志导航器,在其中选择包含该警告的最近构建并展开日志,您将在那里看到它: enter image description here 此外,请注意,虽然您可以像我上面演示的那样抑制警告,但实际上,您很少需要这样做。以您的示例为例,如果您的项目iOS部署目标是4.3,则不会收到该警告。如果您的部署目标是6.0或更高版本,则会收到该警告,但再次说明,因为自iOS 5.0起,您通常不需要使用此条件代码调用dismissModalViewControllerAnimated
您需要在代码中抑制此警告的唯一时间是如果您有源代码,要包含在未来的项目中,而您不知道部署目标将是什么。以您的示例为例,如果您不知道上述代码将包含在具有4.3部署目标或5.0+部署目标的项目中。在这种情况下,此语法非常有用。但是,您也可以对__IPHONE_OS_VERSION_MIN_REQUIRED进行条件检查,例如:
#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)])
    {
        //post-iOS5.0
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else
    {
        // pre-iOS5.0
        [self dismissModalViewControllerAnimated:YES];
    }
#else
    [self dismissViewControllerAnimated:YES completion:nil];
#endif

有没有关于如何处理Swift中的#pragma命令的想法。我正在考虑在桥接头文件中定义一些常量,并尝试在Swift中调用它们。 - Tommie C.

1
  1. 除非你特别想支持旧的iOS版本,否则应该使用最新的方法,然后你应该使用你上面概述的方法。"标识为已弃用的方法已被取代,并且可能在未来不受支持。"
  2. 如果您将应用程序目标中的部署目标更改为5.0,则不会显示iOS 5的已弃用警告作为错误。

如果您真的对向后兼容性感兴趣,可以通过Ray Wenderlich的这里进行教程。


感谢提供教程链接。 - ConfusedDeer

0

是的,许多警告存在并且需要以模态视图的方式解决。替换为:

iOS 6 中的解决方法如下:

  1. [self dismissViewControllerAnimated:NO completion:nil];

  2. [self presentViewController:vc animated:NO completion:nil];


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