Frage

Ich unterstütze 10.4+ durch die meist aktuelle API zur Laufzeit Kommissionierung:

if ([fileManager respondsToSelector:@selector(removeItemAtPath:error:)])
    [fileManager removeItemAtPath:downloadDir error:NULL];
else
    [fileManager removeFileAtPath:downloadDir handler:nil];

In diesem Fall 10.5 und höher wird removeItemAtPath:error: verwenden und 10.4 wird removeFileAtPath:handler: verwenden. Große, aber ich habe immer noch Compiler-Warnungen für die alten Methoden:

warning: 'removeFileAtPath:handler:' is deprecated [-Wdeprecated-declarations]

Gibt es eine Syntax von if([… respondsToSelector:@selector(…)]){ … } else { … } dass Hinweise der Compiler (Clang) auf dieser Linie nicht zu warnen?

Wenn nicht, ist es eine Möglichkeit zu Tag, dass Zeile für -Wdeprecated-declarations ignoriert werden?


Nachdem ich einige der Antworten zu sehen, lassen Sie mich klarstellen, dass verwirrend die Compiler in nicht zu wissen, was ich tue, ist keine gültige Lösung.

War es hilfreich?

Lösung

fand ich Beispiel im Handbuch des Clang-Compiler Benutzer, lässt ich ignoriere die Warnung:

if ([fileManager respondsToSelector:@selector(removeItemAtPath:error:)]) {
    [fileManager removeItemAtPath:downloadDir error:NULL];
} else {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    [fileManager removeFileAtPath:downloadDir handler:nil];
#pragma clang diagnostic pop
}

Andere Tipps

Sie können eine separate Datei deklarieren, die für den Aufruf von veralteten Methoden bezeichnet und stellen Sie die pro-Datei Compiler-Flags in Xcode -Wdeprecated-declarations zu ignorieren. Sie können dann eine Dummy-Funktion in der Datei definieren die veralteten Methoden aufrufen und damit die Warnungen in Ihrem realen Quelldateien zu vermeiden.

Ich bin mir nicht sicher, ob Klirren intelligent genug ist, diese zu fangen, aber wenn es nicht ist, können Sie mit performSelector:withObject:withObject: oder Gebäude und Aufrufen eines NSInvocation Objekt versuchen.

Sie könnten nur werfen fileManager zu einem id - ids sind in der Lage zu jedem Objective-C Objekt zu verweisen, so dass der Compiler nicht sollte Methoden überprüfen, die auf einem heißen:

[(id)fileManager removeItemAtPath:downloadDir error:NULL];

nicht erhebt keine Warnungen oder Fehler.

Natürlich ist diese andere Probleme aufwirft - nämlich Sie verlieren alle Kompilierung-Überprüfung für auf der id genannten Methoden. Also, wenn Sie falsch schreiben Sie Methodennamen, etc, es gefangen werden werde nicht bis diese Codezeile ausgeführt wird.

Wenn Sie jede Form von „verwirrend“ Compiler betrachten eine ungültige Lösung zu sein, sind Sie wahrscheinlich mit der Warnung, gehen zu müssen, um leben. (In meinem Buch, wenn Sie, wie Sie fragen loswerden eine Warnung zu erhalten, ist es unklug, einen geschenkten Gaul ins Maul schauen und sagt etwas ungültig ist, nur weil es nicht so aussieht man erwarten würde.)

Die Antworten, dass die Arbeiten zur Laufzeit beinhalten den Betrieb Maskierung, die mit dynamischen Dispatch geschieht so dass der Compiler nicht über den veralteten Aufruf beschwert. Wenn Sie möchten, dass Ansatz nicht tun, können Sie deaktivieren „Warnen Veralten Funktionen“ in Ihren Xcode-Projekt oder Zielsystemeinstellungen, aber das ist generell eine schlechte Idee. Sie wollen über veralteten APIs wissen, aber in diesem Fall, dass Sie es zu benutzen, ohne Vorwarnung. Es gibt einfache und harte Wege, dies zu tun, und Chancen sind Sie in irgendeiner Form alle von ihnen „ungültig“ würden betrachten, aber das verhindert nicht, dass sie von wirksam, auch richtig. ; -)

Eine Möglichkeit, die Warnungen und dennoch wählt zur Laufzeit zu vermeiden, ist objc_msgSend() direkt zu verwenden:

objc_msgSend(fileManager, @selector(removeFileAtPath:error:), downloadDir, nil];

Dies ist, was das Objective-C Laufzeit hat unter der Decke sowieso und soll das gewünschte Ergebnis mit einem Minimum an Aufwand erreichen. Sie können sogar die ursprüngliche Linie darüber zur Klarheit kommentiert lassen. Ich weiß, dass die Dokumentation sagt, „Der Compiler erzeugt Anrufe an die Messaging-Funktion. Sie sollten es nie direkt anrufen in dem Code, den Sie schreiben.“ Sie müssen allein entscheiden, wann es in Ordnung ist, die Regeln zu biegen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top