it-swarm.com.de

Veraltete Warnungen in Xcode unterdrücken

Da alle SDKs herumfliegen, ist es praktisch, für mehrere SDKs und Plattformen bauen zu können. Beim Springen von 3.2 auf 3.0 und gelegentlich sogar 2.x bekomme ich häufig veraltete Warnungen, bei denen veränderte oder überholte Methoden verwendet wurden:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

Gibt es eine Möglichkeit, diese Warnungen zu deaktivieren oder zu deaktivieren, da ich immer noch die Kompatibilität mit älteren Betriebssystemen aufrechterhalten möchte, und ich auch beim Bauen von "Geräuschen" bin?

126
Ben Gottlieb

Versuchen Sie -Wno-deprecated-declarations oder die entsprechende Einstellung in Xcode, GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS (Tipp: Geben Sie in den Build-Einstellungen einfach "veraltet" ein, um die jeweilige Einstellung für diese Warnung zu finden).

Aktuelle Versionen von Xcode (z. B. Xcode 9.2):

 enter image description here


Ursprüngliche Versionen von Xcode (z. B. Xcode 2.x, 3.x):

 enter image description here

74
Paul R

Da ich dem @samiq-Beitrag noch keinen Kommentar hinzufügen kann, werde ich ihn wohl erweitern. Geben Sie die erwähnte Direktive vor einer Funktion/Methode ein, in der Sie veraltetes Zeug verwenden. Dann können Sie nach der Definition des Funktionsendes die vorherige Einstellung wiederherstellen:

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

Clang bietet eine Nice-Funktion, die den "restore" -Schritt im @manicaesar-Beitrag unabhängig vom ursprünglichen Warnstatus macht:

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

Um das Clang Handbuch zu zitieren :

Neben allen Funktionen des GCC-Pragmas bietet Clang auch die Möglichkeit, den aktuellen Warnstatus zu drücken und zu öffnen. Dies ist besonders nützlich, wenn Sie eine Header-Datei schreiben, die von anderen Personen erstellt wird, da Sie nicht wissen, mit welchen Warnflags sie erstellt werden.

139

Da wir in der Regel ältere Betriebssysteme unterstützen müssen, aber unsere Warnhinweise beachten, wollte ich einen aufgeräumteren Weg. Ich habe dies zusammengestellt, inspiriert von Mozilla-Code:

#define SILENCE_DEPRECATION(expr)                                   \
do {                                                                \
_Pragma("clang diagnostic Push")                                    \
_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"")   \
expr;                                                               \
_Pragma("clang diagnostic pop")                                     \
} while(0)

#define SILENCE_IOS7_DEPRECATION(expr) SILENCE_DEPRECATION(expr)
#define SILENCE_IOS8_DEPRECATION(expr) SILENCE_DEPRECATION(expr)

Auf diese Weise können Sie Folgendes tun:

SILENCE_IOS7_DEPRECATION(return [self sizeWithFont:font constrainedToSize:size]);

Es funktioniert auch mit Codeblöcken:

SILENCE_IOS7_DEPRECATION(
    view = [[MKPolylineView alloc] initWithPolyline:self];
    view.lineWidth = self.lineWidth;
    view.strokeColor = self.color;
);

Wenn Sie die Unterstützung für Geräte vor iOS 7 aufgeben, können Sie den Code leicht durchsuchen, um die veralteten Verwendungen zu finden.

39
Joe Hughes

Sie können Warnungen pro Datei auch mit unterdrücken 

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

das macht es ein bisschen besser, als nur einmal und zusammen alle Warnungen zu unterdrücken ... schließlich haben Sie erfahren, wofür Sie es tun.

28
samiq

Wenn Sie die Warnung Die veraltete Methode implementieren oder Die veraltete Klasse implementieren möchten, verwenden Sie

 #pragma clang diagnostic Push 
 #pragma clang diagnostic ignoriert "-Wdeprecated-Implementierungen" 
 // code 
 #pragma clang diagnostic pop 

13
krzysztof

Suchen Sie in Ihren Build-Einstellungen nach Deprecated Functions.

 enter image description here

7
SmallChess

Wenn Sie möchten, dass in einem Code eine umfassende Überprüfung aller Arten von Abwertungen durchgeführt wird. Bitte benutzen Sie das -Wdeprecated Flag wie folgt:

#pragma clang diagnostic Push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop
0
jarora