wake-up-neo.com

Wie eine Methode in Xcode veraltet wird

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

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

Nun, ich bin ein bisschen verwirrt mit diesem Zeug!

Weiß jemand etwas davon?

75
Julien

__attribute__((deprecated)) ist der gcc-Weg (auch in clang unterstützt), um eine Funktion/Methode als veraltet zu markieren. Wenn eine als "veraltet" markiert ist, wird bei jedem Aufruf eine Warnung ausgegeben.

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 bietet auch den <AvailabilityMacros.h>-Header an, der die Makros DEPRECATED_ATTRIBUTE und DEPRECATED_MSG_ATTRIBUTE (msg) bereitstellt, 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.


Anmerkung: Wenn Sie Swift verwenden, verwenden Sie das @available-Attribut , um ein Element abzulehnen, z.

@available(*, deprecated=2.0, message="no longer needed")
func f() {
    ...
}
148
kennytm

Sie können auch besser lesbare define DEPRECATED_ATTRIBUTE verwenden. 

Es wurde in usr/include/AvailabilityMacros.h definiert:

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

Objective-C Methoden Beispiel:

@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
69
skywinder

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

siehe Dokumentation: http://de.cppreference.com/w/cpp/language/attributes

1
Ant6n

Swift 5.0

Veralten 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 unter Apple doc: Attribute

0
Lal Krishna

- FÜR DEN SCHNELLEN CODE:

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

beispiel:

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