Я нашел похожий вопрос, который предполагает, что да , это правильный способ работы с устаревшими методами, а нет , нет никакого способа подавлять предупреждения об устаревании для каждого отдельного случая, но есть хаки, которые могут ввести компилятор в заблуждение.
Чтобы разобраться с примером, я решил создать класс утилит, используя один из этих хаков:
@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 ожидают от нас решения этой проблемы. Другие мысли по этому вопросу будут высоко оценены.