So veralten Sie eine Methode in Xcode

79

Wir haben unsere Bibliothek, die wir an unsere Kunden versenden, und ich möchte einige Methoden als "veraltet" markieren, weil wir sie geändert haben (wie Apple es im iPhone SDK tut).

Ich habe das __OSX_AVAILABLE_BUT_DEPRECATEDVorprozessor-Makro gesehen, das zugeordnet ist __AVAILABILITY_INTERNAL, das zugeordnet ist __attribute__((deprecated))...

Nun, ich bin ein bisschen verwirrt mit diesem Zeug!

Weiß jemand etwas darüber?

Julien
quelle

Antworten:

150

__attribute__((deprecated))ist die gcc-Methode (auch in clang unterstützt ), mit der eine Funktion / Methode als veraltet markiert wird. Wenn einer als "veraltet" markiert ist, wird eine Warnung ausgegeben, wenn jemand ihn anruft.

Die Syntax für normale Funktionen wäre

__attribute__((deprecated))
void f(...) {
  ...
}

// gcc 4.5+ / clang
__attribute__((deprecated("g has been deprecated please use g2 instead")))
void g(...) {
  ...
}

und das von Objective-C-Methoden wäre

@interface MyClass : NSObject { ... }
-(void)f:(id)x __attribute__((deprecated));
...
@end

Sie können auch die gesamte Klasse als veraltet markieren

__attribute__((deprecated))
@interface DeprecatedClass : NSObject { ... }
...
@end

Apple stellt auch den <AvailabilityMacros.h>Header bereit, der die Makros DEPRECATED_ATTRIBUTE und DEPRECATED_MSG_ATTRIBUTE (msg) enthält, die auf die oben genannten Attribute erweitert werden, oder nichts, wenn der Compiler keine Attribute unterstützt. Beachten Sie, dass dieser Header außerhalb von OS X / iOS nicht vorhanden ist.


Randnotiz: Wenn Sie Swift verwenden, verwenden Sie das @availableAttribut, um einen Artikel zu verwerfen, z

@available(*, deprecated=2.0, message="no longer needed")
func f() {
    ...
}
kennytm
quelle
Vielen Dank für diese schnelle Antwort, ich bin mir ziemlich sicher, dass es helfen wird. Ich habe eine Weile gesucht, bevor ich gefragt habe :)
Julien
1
Ich habe nur eine andere Frage: Ist es möglich, eine Nachricht wie "Verwenden Sie stattdessen Methode XXX" hinzuzufügen?
Julien
22
@ Julien: Ja : __attribute((deprecated(use method XXX instead))). Aber diese Syntax ist nur ab gcc 4.5 verfügbar, und die mit Xcode
gelieferte
Wenn ich veraltete Attribute nur zur Methodendeklaration hinzufüge, sagt der Compiler "Attribute bei der Methodenimplementierung und ihre Deklaration müssen übereinstimmen". Muss ich der Methodenimplementierung etwas hinzufügen?
Borut Tomazin
2
Dies sollte nicht die akzeptierte Antwort sein. Es ist nicht so, wie Apple es macht, und es ist viel hässlicher alsDEPRECATED_ATTRIBUTE
Adlai Holler
74

Sie können auch besser lesbare Definitionen verwenden DEPRECATED_ATTRIBUTE

Es definiert in usr/include/AvailabilityMacros.h:

#define DEPRECATED_ATTRIBUTE        __attribute__((deprecated))
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg))))

Beispiel für Objective-C- Methoden:

@interface MyClass : NSObject { ... }
-(void)foo:(id)x DEPRECATED_ATTRIBUTE;

// If you want to specify deprecated message:
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead.");
...
@end

Sie können die gesamte Klasse auch als veraltet markieren:

DEPRECATED_ATTRIBUTE
@interface DeprecatedClass : NSObject { ... }
...
@end
Skywinder
quelle
2
So macht es Apple auch in iOS-Klassen. Wahrscheinlich die bessere Methode.
LunaCodeGirl
2
Es ist definitiv die bessere Methode. Schade, dass es nicht die ausgewählte Antwort oder die Antwort mit der höheren Stimme ist.
Benjohn
Wie kann ich DEPRECATED_MSG_ATTRIBUTEeine Klasse als veraltet mit Nachricht markieren (wie UIAlertView)
Multinerd
1
Gibt es das Konzept des "Umbenennens" ähnlich den verfügbaren Attributen in Swift?
Joe Susnick
5

Swift 5.0

Verwerfen Sie alle Methoden / Klassen / Strukturen / Protokolle mit @available

@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }

@available(*, deprecated, renamed: "loadData")
func fetchData() { }

@available(swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }

@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")

Mögliche Parameter:

  • eingeführt
  • veraltet
  • veraltet
  • Botschaft
  • umbenannt

Weitere Informationen finden Sie im Apple-Dokument: Attribute

Lal Krishna
quelle
1

Wenn Sie C ++ 14 in Ihrem xcode-Projekt verwenden, können Sie auch das Attribut [[deprecated]]oder verwenden [[deprecated("reason")]], das jetzt Teil der Sprache ist.

Siehe Dokumentation: http://en.cppreference.com/w/cpp/language/attributes

Ant6n
quelle
0

- FÜR SWIFT CODE:

Setzen Sie dies direkt über die Methode: @available(*, deprecated: <#Version#>, message: <#Message#>)

Beispiel:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
Mojtaba Hosseini
quelle