Отключение определенного предупреждения в определенной строке в Xcode - PullRequest
26 голосов
/ 29 июня 2010

Я пишу приложение для 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 ]

74 голосов
/ 22 июля 2012

Для 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

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

19 голосов
/ 29 июня 2010

Возможно, вы сможете использовать прагмы 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.

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

8 голосов
/ 30 июня 2010

Вы можете использовать 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);
4 голосов
/ 14 марта 2012

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

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

или

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...