2010-09-04 2 views
4

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

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

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

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

ответ

6

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

Для решения примера случай, я решил создать класс Util с помощью одного из этих писак:

@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

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

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

2, если да, то вызвать этот метод, используя Objective-C функции выполнения:

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

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

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

0

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

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

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

Смежные вопросы