Jak zrezygnować z metody w Xcode

79

Mamy naszą bibliotekę, którą wysyłamy do naszych klientów i chciałbym oznaczyć niektóre metody jako „przestarzałe”, ponieważ je zmieniliśmy (tak jak robi to Apple w iPhone SDK).

Widziałem __OSX_AVAILABLE_BUT_DEPRECATEDmakro preprocesora, do którego jest mapowane __AVAILABILITY_INTERNAL, które jest mapowane na __attribute__((deprecated))...

Cóż, jestem trochę zdezorientowany z tymi rzeczami!

Czy ktoś coś o tym wie?

Julien
źródło

Odpowiedzi:

150

__attribute__((deprecated))jest sposobem gcc (także obsługiwanym w clang ) oznaczania funkcji / metody jako przestarzałej. Gdy ktoś zostanie oznaczony jako „przestarzały”, za każdym razem, gdy ktoś go wywoła, zostanie wyświetlone ostrzeżenie.

Składnia normalnych funkcji byłaby następująca

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

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

a metody Cel-C

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

Możesz również oznaczyć całą klasę jako przestarzałą za pomocą

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

Firma Apple dostarcza również <AvailabilityMacros.h>nagłówek, który zawiera makra DEPRECATED_ATTRIBUTE i DEPRECATED_MSG_ATTRIBUTE (msg), które rozwijają się do powyższych atrybutów lub nic, jeśli kompilator nie obsługuje atrybutów. Zwróć uwagę, że ten nagłówek nie istnieje poza systemem OS X / iOS.


Uwaga dodatkowa, jeśli używasz Swift, używasz @availableatrybutu do wycofania elementu, np

@available(*, deprecated=2.0, message="no longer needed")
func f() {
    ...
}
kennytm
źródło
Dziękuję za tę szybką odpowiedź, jestem prawie pewien, że to pomoże, szukałem przez chwilę zanim zapytałem :)
Julien
1
Mam tylko inne pytanie: czy można dodać wiadomość typu „Zamiast tego użyj metody XXX”?
Julien
22
@Julien: Tak: __attribute((deprecated(use method XXX instead))). Ale ta składnia jest dostępna tylko od gcc 4.5, a wersja dostarczana z Xcode to 4.2 ...
kennytm
Jeśli dodam atrybut przestarzały tylko do deklaracji metody, kompilator mówi „Atrybuty implementacji metody i jej deklaracja muszą być zgodne”. Czy muszę dodać coś do implementacji metody?
Borut Tomazin,
2
To nie powinna być akceptowana odpowiedź. To nie tak, jak robi to Apple i jest o wiele brzydsze niżDEPRECATED_ATTRIBUTE
Adlai Holler
74

Możesz także użyć bardziej czytelnej definicji DEPRECATED_ATTRIBUTE

Zdefiniowano w usr/include/AvailabilityMacros.h:

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

Przykład metod obiektywnych-C :

@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

Możesz też oznaczyć całą klasę jako przestarzałą:

DEPRECATED_ATTRIBUTE
@interface DeprecatedClass : NSObject { ... }
...
@end
skywinder
źródło
2
W ten sposób Apple robi to również w klasach iOS. Prawdopodobnie lepsza metoda.
LunaCodeGirl
2
To zdecydowanie lepsza metoda. Szkoda, że ​​to nie jest wybrana odpowiedź ani wyższa głosowana odpowiedź.
Benjohn,
jak mogę DEPRECATED_MSG_ATTRIBUTEoznaczyć klasę jako przestarzałą za pomocą wiadomości (jak UIAlertView)
Multinerd
1
Czy pojęcie „przemianowania” jest podobne do atrybutów dostępnych w Swift?
Joe Susnick
5

Swift 5.0

Wycofaj wszelkie metody / klasy / struktury / protokoły przy użyciu @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.")

Możliwe parametry:

  • wprowadzone
  • przestarzałe
  • przestarzały
  • wiadomość
  • zmieniono nazwę

Więcej informacji można znaleźć w dokumencie Apple Doc: Attributes

Lal Krishna
źródło
1

Jeśli używasz C ++ 14 w swoim projekcie xcode, możesz również użyć atrybutu [[deprecated]]lub, [[deprecated("reason")]]który jest teraz częścią języka.

patrz dokumentacja: http://en.cppreference.com/w/cpp/language/attributes

Ant6n
źródło
0

- DLA KODU SWIFT:

Umieść to tuż nad metodą: @available(*, deprecated: <#Version#>, message: <#Message#>)

przykład:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
Mojtaba Hosseini
źródło