2010-06-29 3 views
25

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

Я называю:

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

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

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

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

Можно ли это сделать в Xcode?

ответ

71

Для лязга, это работает:

#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 

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

+0

Это сработало отлично, спасибо – elsurudo

+7

Это действительно должно быть отмечено как правильный ответ. Он менее взломан и решает проблему во время компиляции, в дополнение к тому, чтобы быть немного чище. –

+0

+1 для правильного использования clang, это должен быть ответ, NSInvocation - это взлом –

19

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

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

+1

Эти прагмы не допускаются внутрь функций, они должны будут окружить некоторую вспомогательную функцию. –

+0

Спасибо. На самом деле это не работало. Похоже, что ключевые слова «push» и «pop» недействительны, поскольку они генерируют собственные предупреждения. –

+0

Никакого эффекта здесь. – Jonny

8

Вы можете использовать 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); 
+1

Может ли '[NSMethodSignature signatureWithObjCTypes:" v @ cc "]' быть заменен на '[[UIApplication sharedApplication] методSignatureForSelector: @selector (setStatusBarHidden)]', чтобы сделать его более легким для чтения? –

+0

Правильно, конечно. –

+0

Работает лечения. Благодарю. –

4

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

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

или

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

#pragma НКИ диагностического предупреждения «-Wdeprecated деклараций»

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

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