Отключение определенного предупреждения в определенной строке в Xcode

Я пишу приложение для iPhone на основе Base 4.0 SDK, но нацеливаюсь на OS 3.1.3, чтобы пользователи OS 3 могли использовать это приложение.

Я звоню:

[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];

который устарел в iOS 4.0. Я знаю об этом, и у меня есть меры для вызова более новой версии "withAnimation", если мы работаем под iOS 4.0 или выше.

Тем не менее, я получаю предупреждение, что вызываю устаревший SDK.

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

Это может быть достигнуто в Xcode?

4 ответа

Решение

Для CLANG это работает:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
  // Here I like to leave a comment to my future self to explain why I need this deprecated call
  NSString *myUDID = [[UIDevice currentDevice] uniqueIdentifier];
#pragma clang diagnostic pop

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

Возможно, вы сможете использовать прагмы GCC. Это должно отключить устаревшее предупреждение для вложенной функции.

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated"
-(void)foo{
    // As Georg Fritzsche notes below, the pragmas only work outside of functions
    [[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
}
#pragma GCC diagnostic pop

Я не знаю, будет ли это работать с Clang, но это должно работать с GCC.

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

Ты можешь использовать NSInvocation чтобы обойти предупреждения независимо от используемого компилятора:

UIApplication *app = [UIApplication sharedApplication];
SEL sel = @selector(setStatusBarHidden:animated:);
NSMethodSignature *sig = [app methodSignatureForSelector:sel];
NSInvocation *inv = [NSInvocation invocationWithMethodSignature:sig];
BOOL b = YES;
[inv setTarget:app];
[inv setSelector:sel];
[inv setArgument:&b atIndex:2];
[inv setArgument:&b atIndex:3];
[inv invoke];

Или менее терпимым к ошибкам способом:

UIApplication *app = [UIApplication sharedApplication];
SEL sel = @selector(setStatusBarHidden:animated:);
IMP imp = [app methodForSelector:sel];
imp(app, sel, YES, YES);

Вы можете выполнить это так, чтобы преодолеть предупреждения сразу

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
(void) methodUsingDeprecatedStuff { //use deprecated stuff }

или же

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

#pragma GCC диагностическое предупреждение "-Wdeprecated-декларации"

это удалит предупреждения.

Надеюсь, это поможет вам.

Другие вопросы по тегам