2010-06-29 27 views
25

Sto scrivendo un'applicazione per iPhone contro l'SDK Base 4.0, ma ho scelto come target OS 3.1.3 in modo operativo 3 gli utenti possono utilizzare l'applicazione.Disattivazione un'avvertenza specifica in una linea specifica in Xcode

io chiamo:

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

che è deprecato in iOS 4.0. Sono a conoscenza di questo e sono in atto misure per chiamare la versione più recente "withAnimation" se stiamo utilizzando iOS 4.0 o versioni successive.

Tuttavia, sto diventando un avvertimento che sto chiamando uno SDK deprecato.

vorrei disattivare l'avviso specifica in questo luogo specifico. Voglio tutte le altre avvertenze (tra cui lo stesso avvertimento deprecato in altre sedi)

può questo essere realizzato in Xcode?

risposta

71

Per CLANG, questo funziona:

#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 

è possibile utilizzarlo all'interno di un metodo, che ti permette di essere molto specifico circa la linea che causa l'avviso che si desidera avere ignorato.

+0

ha funzionato alla grande, grazie – elsurudo

+7

Questo dovrebbe essere veramente contrassegnato come la risposta corretta. È meno hacky e risolve il problema in fase di compilazione, oltre ad essere un po 'più pulito. –

+0

+1 per l'uso corretto di clang, questa dovrebbe essere la risposta, NSInvocation è un hack –

19

Potrebbe essere possibile utilizzare i prgma GCC. Questo dovrebbe disabilitare l'avviso deprecato per la funzione chiusa.

#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 

Non so se questo funzionerà con Clang, ma dovrebbe lavoro con GCC.

Fondamentalmente, si salva lo stato delle avvertenze/errori, disattiva l'allarme deprecato, compila la funzione, poi ripristina lo stato della diagnostica.

+1

Tali prefissi non sono consentiti all'interno delle funzioni, dovrebbero circondare alcune funzioni di supporto. –

+0

Grazie. Questo in realtà non ha funzionato. Sembra che le parole chiave "push" e "pop" non siano valide, in quanto hanno generato i propri avvisi. –

+0

Nessun effetto qui. – Jonny

8

È possibile utilizzare NSInvocation per aggirare gli avvertimenti indipendenti del compilatore utilizzate:

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]; 

o in modo meno a tolleranza d'errore:

UIApplication *app = [UIApplication sharedApplication]; 
SEL sel = @selector(setStatusBarHidden:animated:); 
IMP imp = [app methodForSelector:sel]; 
imp(app, sel, YES, YES); 
+1

Può la '[NSMethodSignature signatureWithObjCTypes: "v @ cc"]' sostituito con '[[UIApplication sharedApplication] methodSignatureForSelector: @selector (setStatusBarHidden)]' per renderlo più facile da leggere? –

+0

Giusto, ovviamente. –

+0

Funziona a meraviglia. Grazie. –

4

è possibile eseguire in questo modo di superare gli avvertimenti in una sola volta

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

o

semplicemente incollare questa linea prima di utilizzare i vostri animali deprecate ogni volta per evitare avvertimenti avvertimento diagnostica GCC

#pragma "-Wdeprecated-dichiarazioni"

questo rimuoverà le avvertenze.

Spero che ti possa aiutare.

Problemi correlati