Veraltete Warnungen in Xcode unterdrücken

133

Da alle SDKs im Umlauf sind, ist es praktisch, für mehrere SDKs und Plattformen erstellen zu können. Wenn ich jedoch von 3.2 auf 3.0 und gelegentlich sogar auf 2.x hüpfe, erhalte ich häufig veraltete Warnungen bezüglich Methoden, die geändert oder ersetzt wurden:

warning: 'UIKeyboardBoundsUserInfoKey' is deprecated.

Gibt es eine Möglichkeit, diese Warnungen zu deaktivieren oder zu deaktivieren, da ich weiterhin die Kompatibilität mit älteren Betriebssystemen beibehalten möchte und mich auch bemühe, beim Erstellen "Rauschen" zu entfernen?

Ben Gottlieb
quelle
4
Während die Antwort von Paul R funktioniert, sollten Sie bedenken, dass Manicaesar etwas chirurgischer ist, da Sie damit genau die gewünschte Warnung unterdrücken können, ohne andere zusätzliche Warnungen zu verlieren, die wichtig sein könnten. Es scheint mir, dass Manicaesar in Bezug auf Best Practices The Correct Answer ™
Olie

Antworten:

82

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

Aktuelle Versionen von Xcode (zB Xcode 9.2):

Geben Sie hier die Bildbeschreibung ein


Alte Versionen von Xcode (zB Xcode 2.x, 3.x):

Geben Sie hier die Bildbeschreibung ein

Paul R.
quelle
17
Es stellt sich heraus, dass es noch einfacher ist; In den Xcode-Zieleinstellungen befindet sich ein Kontrollkästchen. Ihre Antwort veranlasste mich, dort zu suchen. Vielen Dank!
Ben Gottlieb
4
Sie können dies auch pro Datei tun. Siehe diese Antwort zum Hinzufügen von Flags pro Datei: stackoverflow.com/a/6658549/272473
mrwalker
4
Antworten wie diese sind für Neulinge frustrierend. Versuchen Sie es wo? Wie finde ich Zieleinstellungen? Eine etwas ausführlichere Erklärung würde den Wert dieser Antwort erhöhen.
Noogrub
8
Eine Antwort, die so schlecht erklärt wurde, sollte nicht als richtig markiert werden.
Chris Hatton
6
Suchen Sie in den Build-Einstellungen nach "Veraltet" und Sie werden es sehen.
Quantumpotato
337

Da ich dem @ samiq-Beitrag noch keinen Kommentar hinzufügen kann, denke ich, dass ich ihn erweitern werde. Geben Sie die erwähnte Direktive vor einer Funktion / Methode ein, in der Sie veraltete Inhalte verwenden. Anschließend können Sie die vorherige Einstellung nach der Definition des Funktionsende wiederherstellen:

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma GCC diagnostic pop
Manicaesar
quelle
1
Ausgezeichnet! Dies ist, was ich gesucht habe +1 :)
Zoran Simic
1
Super Tipp! Schade, dass es nicht innerhalb einer Methode deklariert werden kann.
Dustin
12
Tatsächlich kann es innerhalb einer Methode deklariert werden. Ich musste es heute nur wegen eines Fehlers in der docs / sdk tun
jer
6
+1 Eine etwas bessere Möglichkeit ist die Verwendung der Syntax mit, #pragma GCC diagnostics push #pragma GCC diagnostics ignored "-Wdeprecated-declarations" .. .. Code here .. .. #pragma GCC diagnostic pop da diese Methode Sie zu den zuvor festgelegten Einstellungen zurückführt
Niclas
3
Geändert nach Vorschlägen :)
Manicaesar
143

Clang bietet eine nette Funktion, die den Schritt "Wiederherstellen" im @ manicaesar-Post unabhängig vom anfä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 :

Zusätzlich zu allen Funktionen, die das GCC-Pragma bietet, können Sie mit Clang auch den aktuellen Warnstatus verschieben und anzeigen. Dies ist besonders nützlich, wenn Sie eine Header-Datei schreiben, die von anderen Personen kompiliert wird, da Sie nicht wissen, mit welchen Warnflags sie erstellen.

Andrew Hershberger
quelle
1
Neuere Versionen von GCC verwenden dieselbe Syntax (ersetzen Sie GCC durch Clang).
Niclas
3
Ich bin immer verwirrt darüber, was LLVM, GCC und Clang sind. Also wollte ich eine Notiz hinterlassen, um Zeit zu sparen. GNU Complier Collection (GCC) wurde mit Xcode 3 verwendet, dann veröffentlichte Apple Xcode 4 mit einem Hybrid-LLVM-GCC. Dann übernahm der LLVM-Compiler (Low Level Virtual Machine). Weitere Informationen finden Sie unter llvm.org . Ab Xcode 7.2.1 ist der Standard-Compiler Apple LLVM 7.0. Der LLVM-Compiler ist eine Bibliothek mit anderen "Projekten", Debuggern und anderen Tools, einschließlich des nativen Clang-Compilers. Clang ist ein "LLVM native" C / C ++ / Objective-C-Compiler.
Serge-k
42

Da wir in der Regel ältere Betriebssysteme unterstützen müssen, aber auf unsere Warnungen achten, wollte ich einen übersichtlicheren Weg, dies zu tun. Ich habe dies zusammengestellt, inspiriert von einem 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 einstellen, können Sie den Code leicht durchsuchen, um die veralteten Verwendungen zu finden, die behoben werden müssen.

Joe Hughes
quelle
Dies ist eine viel bessere langfristige Lösung für den meisten Code, als die Verwerfungswarnungen (oder andere) auf globaler / Projektebene einzudämmen. tolle Antwort.
Natbro
1
Warum ist das do { ... } while(0);erforderlich?
Ben Leggiero
1
@ BenC.R.Leggiero, weil Sie keinen Block, sondern mehrere Anweisungen zwischen diesen Klammern übergeben. Grundsätzlich unterdrücken Sie Warnungen für jede Zeile.
Alejandro Iván
1
@ AlejandroIván Ich weiß, dass deine Erklärung für dich Sinn macht ... aber für mich sieht es nur so aus, als würdest du die Frage neu formulieren. Können Sie erklären, warum do{...}while(0);hier besonders erforderlich ist? Warum nicht einfach {...}? Warum nicht if(true){...}? usw.
Ben Leggiero
2
@ BenC.R.Leggiero du hast recht. Aus irgendeinem Grund habe ich Ihre Frage falsch verstanden. Überprüfen Sie die akzeptierte Antwort hier: stackoverflow.com/questions/154136/…
Alejandro Iván
29

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

#pragma GCC diagnostic ignored "-Wdeprecated-declarations"

was es wiederum ein bisschen besser macht, als alle Warnungen einmal und zusammen zu unterdrücken ... schließlich müssen Sie wissen, wofür Sie es tun.

Samiq
quelle
20

Wenn Sie die Warnung zum Implementieren einer veralteten Methode oder einer veralteten Klasse zum Schweigen bringen möchten , verwenden Sie:

    #pragma clang diagnostischer Push
    #pragma clang Diagnose ignoriert "-Wdeprecated-Implementierungen"
    // Code
    #pragma clang diagnostischer Pop

krzysztof
quelle
Wenn ich "-Wdeprecated-Deklarationen" gesehen habe, muss es wohl "-Wdeprecated-Implementierungen" geben. Und es funktioniert wirklich. Danke dir.
DawnSong
8

Suchen Sie in Ihren Build-Einstellungen Deprecated Functions.

Geben Sie hier die Bildbeschreibung ein

Hallo Welt
quelle
Es werden alle "veralteten" Warnungen geschlossen, es müssen jedoch nur einige Warnungen unterdrückt werden.
DawnSong
2

Wenn Sie eine pauschale Überprüfung auf alle Arten von Abwertungen in einem Code wünschen. Bitte verwenden Sie das Flag -Wdeprecated wie folgt :

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated"
- (void) methodUsingDeprecatedStuff {
    //use deprecated stuff
}
#pragma clang diagnostic pop
Jarora
quelle
-3

Fügen Sie die folgende Zeile oben in der Datei hinzu, um die Warnung aus der Header-Datei eines Drittanbieters zu deaktivieren

#pragma clang system_header
Harvestli
quelle