Подтвердить что ты не робот

Отключение определенного предупреждения в определенной строке в 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?

4b9b3361

Ответ 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"

это приведет к удалению предупреждений.

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