Подавление предупреждений компилятора XCode для конкретных строк

Как и в случае с вопросом Бена Готлиба, у меня есть несколько устаревших вызовов, которые меня беспокоят. Есть ли способ подавить предупреждения по строкам? Например:

 if([[UIApplication sharedApplication]
  respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) {

  [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
 } else {
  [[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO]; //causes deprecation warning
 }

Все, что меня волнует, это линия. Я не хочу отключать все предупреждения об устаревании. Я также не хотел бы делать что-то вроде подавлять определенные предупреждения файлом.

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


person MrHen    schedule 17.05.2010    source источник


Ответы (1)


Винсент Гейбл опубликовал интересное решение. Короче:

@protocol UIApplicationDeprecatedMethods
- (void)setStatusBarHidden:(BOOL)hidden animated:(BOOL)animated;
@end

if([[UIApplication sharedApplication] respondsToSelector:@selector(setStatusBarHidden:withAnimation:)]) {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide]; 
} else { 
    id<UIApplicationDeprecatedMethods> app = [UIApplication sharedApplication];
    [app setStatusBarHidden:YES animated:NO];
}
person mbauman    schedule 18.05.2010
comment
Прохладный. Я предполагаю, что это работает, чтобы избежать предупреждений об устаревании. Однако более абстрактный вопрос остается открытым. Есть ли способ подавить конкретное предупреждение в XCode? - person MrHen; 18.05.2010
comment
К сожалению, в основном все или ничего. Благодаря использованию #pragma GCC diagnostic ... (gcc.gnu.org/onlinedocs/gcc/Diagnostic- Pragmas.html), вы можете отключить конкретное предупреждение для каждого файла более очевидным способом, чем настройки сборки для каждого файла. Для этого требуется GCC 4.2+, и он должен быть размещен в самом верху единицы перевода. - person mbauman; 18.05.2010
comment
@ matt-b К вашему сведению, я думаю, что нашел лучший способ справиться с предупреждениями об устаревании. Если я использую UIApplication для (id), ошибка исчезнет. Вы можете придумать причину, по которой это неправильно? - person MrHen; 24.05.2010
comment
@MrHen: Да, иногда это срабатывает. Когда вы отправляете id селектор, компилятор проверяет, может ли хотя бы некоторый класс ответить на такой селектор. Это не всегда может иметь место с устаревшим селектором. В противном случае выдается предупреждение о том, что метод не найден. Таким образом, добавление протокола - более надежное решение; он всегда будет обходить предупреждение. - person mbauman; 24.05.2010
comment
У меня это работает, но мне нужно сделать одно изменение. Мой код гласит: id ‹UIApplicationDeprecatedMethods› app = (id) [UIApplication sharedApplication]; В противном случае эта строка дает мне предупреждение. - person William Jockusch; 24.06.2010
comment
Ну конечно. Обычно я делаю все в одну строчку ((id<UIApplicationDeprecatedMethods>)[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];), но для удобства чтения я разбил ее на две части. Спасибо за заметку, @William. - person mbauman; 25.06.2010
comment
@MattB: компилятор проверяет, может ли хотя бы какой-то класс ответить на такой селектор. Компилятор просто заботится о том, чтобы он был объявлен где-нибудь в текущей области видимости. Неважно где. Поскольку вы получаете предупреждение об устаревании, оно объявлено где-то устаревшим. Таким образом, использование id всегда будет работать. - person user102008; 25.04.2012