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

Con*_*eer 15 warnings deprecated ios ios6

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

我正在响应选择器(上面)代码来处理弃用的方法.这样我的应用程序与旧版本的iOS兼容,但我在代码中收到警告:"'dismissModalViewControllerAnimated:'已被弃用:首先在iOS 6.0中弃用"我个人不喜欢我的代码中的任何警告,但是更重要的是,我在某处读到苹果会在你的代码中抱怨警告.

1)Apple会在您的代码中抱怨警告吗?

2)我是否正确处理弃用方法?

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

Rob*_*Rob 19

  1. Apple不知道您使用代码收到的任何编译时警告.

  2. 是的,您正确地处理了这种做法.显然,在这种情况下,如果您在5.0之前支持iOS,则只需要完成这项工作.但是,通常,测试方法是否可以被调用然后调用适当的再现的技术是绝对正确的.

  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
    }
    
    Run Code Online (Sandbox Code Playgroud)

    顺便说一下,如果你想知道-W你的特定警告的代码是什么,请转到你的日志导航器,选择包含警告的最新版本,然后展开日志,你会在那里看到它:

    在此输入图像描述

另请注意,虽然您可以像我上面所说的那样压制警告,但在实践中,您很少需要这样做.使用您的示例,如果您的项目的iOS部署目标是4.3,则不会收到警告.如果你的部署目标是6.0或更高,你会得到那个警告,但是再一次,你可能不需要这个条件代码来调用dismissModalViewControllerAnimated因为有效的iOS 5.0,你可以随时使用dismissViewControllerAnimated.

您需要在代码中禁止此警告的唯一情况是,如果您有源代码,将来要包含在项目中,您不知道部署目标是什么.使用您的示例,如果您不知道上述代码是否将包含在具有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
Run Code Online (Sandbox Code Playgroud)