Подтвердить что ты не робот

Устаревшие предупреждения в xcode и способы устранения устаревания

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

Я делаю ответ на код селектора (выше) для обработки устаревших методов. Таким образом, мое приложение совместимо со старыми версиями iOS, но я получаю предупреждения в своем коде, заявляя: "rejectModalViewControllerAnimated:" устарел: сначала устарел в iOS 6.0", Мне лично не нравится какое-либо предупреждение в моем коде, но что более важно, я где-то читал, что яблоко будет жаловаться на предупреждения в вашем коде.

1) Будет ли Apple жаловаться на предупреждения в вашем коде?

2) Правильно ли я обрабатываю устаревшие методы?

3) Есть ли способ отключить предупреждения устаревших методов метода?

4b9b3361

Ответ 1

  • Apple не знает о любых предупреждениях о компиляции, которые вы получаете с помощью своего кода.

  • Да, вы правильно относитесь к этой практике. Понятно, что в этом случае вам нужно только выполнить эти усилия, если вы поддерживаете iOS до 5.0. Но, в общем, метод проверки того, можно ли вызвать метод, а затем вызвать соответствующее преобразование, абсолютно корректен.

  • Если вы хотите отключить предупреждение, вы просто временно отключите предупреждение, а затем снова включите его, используя соответствующий синтаксис #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 или выше, вы получите это предупреждение, но, опять же, вам, вероятно, не понадобится этот условный код для вызова 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

Ответ 2

  • Нет
  • Вам следует использовать самые последние методы, если вы специально не пытаетесь поддерживать старые версии iOS, тогда вы должны использовать метод, описанный выше. "Метод, обозначенный как устаревший, был заменен и может стать неподдерживаемым в будущем".
  • Если вы измените цель развертывания в целевом приложении на 5.0, устаревшие предупреждения для iOS 5 не будут отображаться как ошибки.

Если вы действительно заинтересованы в обратной совместимости, есть отличный учебник от Ray Wenderlich здесь

Ответ 3

Да. Многие предупреждения присутствуют и упускают вид, чтобы зафиксировать, что Replace:

в ios 6 это: -

  • [self dismissViewControllerAnimated:NO completion:nil];

  • [self presentViewController:vc animated:NO completion:nil];