Отключение определенного предупреждения в определенной строке в Xcode
Я пишу iPhone-приложение против SDK Base 4.0, но я нацелен на OS 3.1.3, поэтому пользователи OS 3 могут использовать это приложение.
Я звоню:
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:YES];
который устарел в iOS 4.0. Я знаю об этом и принимаю меры для вызова новой версии "withAnimation", если мы работаем под iOS 4.0 или выше.
Однако я получаю предупреждение о том, что я вызываю устаревший SDK.
Я хотел бы отключить это конкретное предупреждение в этом конкретном месте. Я хочу, чтобы все другие предупреждения (включая те же устаревшие предупреждения в других местах)
Может ли это быть выполнено в Xcode?
Ответы
Ответ 1
Для 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
Вы можете использовать его внутри метода, который позволяет вам быть очень конкретным в строке, вызывающей предупреждение, которое вы хотите игнорировать.
Ответ 2
Возможно, вы сможете использовать прагмы 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.
В основном, он сохраняет состояние предупреждений/ошибок, отключает устаревшее предупреждение, компилирует функцию, а затем восстанавливает состояние диагностики.
Ответ 3
Вы можете использовать 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
вы можете выполнить его таким образом, чтобы сразу устранить предупреждения
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
(void) methodUsingDeprecatedStuff { //use deprecated stuff }
или
Просто вставьте эту строку, прежде чем использовать устаревшие вещи каждый раз, чтобы избежать предупреждений
#pragma GCC диагностическое предупреждение "-Wdeprecated-declarations"
это приведет к удалению предупреждений.
Надеюсь, это поможет вам.