Отключение определенного предупреждения в определенной строке в 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-декларации"
это удалит предупреждения.
Надеюсь, это поможет вам.