Работа с устаревшими методами в iPhone - PullRequest
5 голосов
/ 04 сентября 2010

Как вы справляетесь с устаревшими методами в iPhone, которые требуют использования более нового метода, недоступного в более старых версиях?

Рассмотрим случай setStatusBarHidden:animated:, который был устаревшим в iOS 3.2.Документация указывает на то, что вы должны использовать setStatusBarHidden:withAnimation:, который доступен только в iOS 3.2 или более поздней версии.

Если я правильно понимаю, это означает, что для таргетинга на все устройства (iOS 3.0 или более поздней версии) я должен сначала задатьесли setStatusBarHidden:withAnimation: доступно.Если это так, используйте его.Если нет, используйте устаревший метод.Но я все равно получил бы предупреждение об устаревании.

Это правильно (пожалуйста, скажите, что это не так!)?Если это так, есть ли способ подавить это предупреждение об устаревании или указать компилятору, что я уже обработал проблему?

Ответы [ 3 ]

6 голосов
/ 05 сентября 2010

Я нашел похожий вопрос, который предполагает, что да , это правильный способ работы с устаревшими методами, а нет , нет никакого способа подавлять предупреждения об устаревании для каждого отдельного случая, но есть хаки, которые могут ввести компилятор в заблуждение.

Чтобы разобраться с примером, я решил создать класс утилит, используя один из этих хаков:

@protocol UIApplicationDeprecated

- (void) setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated;

@end

@implementation UIUtils

+ (void) setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated {
    if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) {
        [[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:animated ? UIStatusBarAnimationSlide : UIStatusBarAnimationNone]; 
    } else { 
        id<UIApplicationDeprecated> app = (id)[UIApplication sharedApplication];
        [app setStatusBarHidden:hidden animated:animated];
    }
}

@end

Если я не ошибаюсь, использование respondsToSelector обходится дорого. Это может быть оптимизировано для производительности, чтобы помнить, если новый селектор присутствует после первого запроса, таким образом избегая необходимости отражения в последующих вызовах.

Исходя из опыта Java, я нахожу такой способ борьбы с устареванием ужасным, и до сих пор не могу поверить, что именно так дизайнеры iOS ожидают от нас решения этой проблемы. Другие мысли по этому вопросу будут высоко оценены.

1 голос
/ 04 сентября 2010

Возможно, есть лучший ответ, но я однажды сделал:

1 проверьте, доступен ли deprecatedMethod. (используя метод respondsToSelector:)

2, если да, затем вызвать этот метод с помощью функции времени выполнения target-c:

id objc_msgSend(id theReceiver, SEL theSelector, ...)

при использовании этой функции компилятор не будет предупреждать вас:)

3 мудро используйте новый метод

0 голосов
/ 27 сентября 2010

Метод вызова таким образом:

id objc_msgSend(id theReceiver, SEL theSelector, ...)

будет лучшим выбором, если вы хотите опустить предупреждение о том, что UIApplication может не отвечать на метод setStatusBarHidden:withAnimation: (в iOS 3.0 или более поздней версии).

...