2010-06-29 18 views
25

Ich schreibe eine iPhone-App für das Base 4.0 SDK, aber ich ziele auf OS 3.1.3, damit Benutzer von OS 3 die App verwenden können.Deaktivierung einer bestimmten Warnung in einer bestimmten Zeile in Xcode

Ich nenne:

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

, die in iOS 4.0 ist veraltet. Ich bin mir dessen bewusst und habe Maßnahmen ergriffen, um die neuere "withAnimation" -Version aufzurufen, wenn wir unter iOS 4.0 oder höher laufen.

Ich erhalte jedoch eine Warnung, dass ich ein veraltetes SDK anrufe.

Ich möchte diese spezifische Warnung an diesem bestimmten Ort deaktivieren. Ich möchte alle anderen Warnungen (einschließlich der gleichen veralteten Warnung an anderen Standorten)

Kann dies in Xcode erreicht werden?

Antwort

71

Für CLANG, das funktioniert:

#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 

Sie es innerhalb einer Methode verwenden, die Sie sehr spezifisch über die Linie sein, ermöglicht es, dass die Warnung Sie ignoriert haben möchten verursacht.

+0

das hat gut funktioniert, danke – elsurudo

+7

Dies sollte wirklich als die richtige Antwort markiert werden. Es ist weniger hacky und löst das Problem zur Kompilierzeit, zusätzlich zu ein bisschen sauberer. –

+0

+1 für die korrekte Verwendung von Klängen, sollte dies die Antwort sein, NSInvocation ist ein Hack –

19

Möglicherweise können Sie GCC-Pragmas verwenden. Dies sollte die veraltete Warnung für die beiliegende Funktion deaktivieren.

#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 

Ich weiß nicht, ob dies mit Clang arbeiten, aber es sollte mit GCC Arbeit.

Grundsätzlich speichert es den Status der Warnungen/Fehler, deaktiviert die veraltete Warnung, kompiliert die Funktion und stellt dann den Status der Diagnose wieder her.

+1

Diese Pragmas sind in Funktionen nicht erlaubt, sie müssten eine Hilfsfunktion umgeben. –

+0

Danke. Das hat nicht wirklich funktioniert. Es sieht so aus, als ob die Keywords "push" und "pop" nicht gültig sind, da sie ihre eigenen Warnungen generiert haben. –

+0

Kein Effekt hier. – Jonny

8

können Sie NSInvocation verwenden unabhängig von der Compiler um die Warnungen zu erhalten verwendet:

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

Oder in einem weniger fehlertolerant:

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

Könnte '' [[UIApplication sharedApplication] methodSignatureForSelector: @selector (setStatusBarHidden)] 'durch [[NSMethodSignature signatureWithObjCTypes:" v @ cc "]' 'ersetzt werden, um das Lesen zu erleichtern? –

+0

Richtig, natürlich. –

+0

Funktioniert gut. Vielen Dank. –

4

Sie es wie folgt ausführen zu überwinden die Warnungen auf einmal

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

oder

einfach diese Zeile einzufügen, bevor Sie veraltet stopft jedes Mal mit Warnungen zu vermeiden

Pragma GCC Diagnosewarnung „-Wdeprecated-Erklärungen“

dies die Warnungen entfernen.

Ich hoffe, es wird Ihnen helfen.

Verwandte Themen