Jak oznaczyć metodę jako przestarzałą w Objective-C 2.0?

141

Jestem częścią zespołu opracowującego dość dużą aplikację na iPada iw rezultacie stworzyliśmy wiele różnych klas. Problem polega na tym, że niektóre metody są teraz dość przestarzałe i nie chcę ich po prostu usuwać, ponieważ wiem, że niektóre części całego systemu używają metod ... ale są dostępne lepsze (nowsze) warianty, które powinny być używane zamiast tego (niektóre stare faktycznie nazywają nowe, ale ogólny interfejs klasy robi się bałaganiarski).

Czy istnieje sposób, w jaki mogę oznaczyć niektóre metody jako zdeprecjonowane (jak @deprecatedw Javie i [Obsolete].NET).

Widzę, że Apple używa Availability.h i ma tagi, takie jak

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... czy to jedyny sposób, aby to zrobić (+ czy jest to bezpieczne w App Store?), czy też istnieją alternatywy, które oznaczą ostrzeżenie w Xcode?

Jamie Chapman
źródło

Odpowiedzi:

163

Składnia wycofania

Podano składnię, aby oznaczyć metody jako przestarzałe:

@interface SomeClass
-method __attribute__((deprecated));
@end

lub:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end
Shay Erlichmen
źródło
7
To makro ma dla mnie sens, w pewnym sensie zachowuje charakter __attribute__składni. #define __deprecated__ __attribute__((deprecated))
zekel
Co ciekawe, Xcode nie ostrzega mnie przed użyciem metody oznaczonej jako zdeprecjonowana. Czy istnieje flaga kompilatora, którą należy ustawić?
memmons
Na liście rozwijanej uzupełniania kodu Xcode widzę, że metoda jest oznaczona jako zdeprecjonowana, ale użycie jej nie powoduje ostrzeżenia kompilatora.
memmons
1
@Answerbot Ustawienia kompilacji> ostrzegaj o przestarzałych funkcjach ... ustaw na TAK
bandejapaisa
jak dodać metodę alternatywną, której należy użyć?
OXXY
135

IMHO, łatwiej jest napisać __deprecated:

- (void)myDeprecatedMethod __deprecated;
- (int)methodNameDeprecated:(int)param __deprecated;

Działa też na zajęciach

__deprecated
@interface MyDeprecatedClass

  // ... some properties and methods ...

@end
Víctor B.
źródło
2
O wiele lepszy sposób na zrobienie tego.
SG1
1
Nie podano opisu, więc nie będziesz wiedział, czy powinieneś użyć innej metody, czy co ...
raistlin
1
#define __deprecated __attribute __ ((przestarzałe))
Parag Bafna
Dlaczego jest lepszy niż DEPRECATED_ATTRIBUTE? Tylko dlatego, że jest krótszy, czy jest jakaś rzeczywista różnica?
kelin
88

Jeśli chcesz przekazać dodatkowy komunikat z flagą wycofania, możesz użyć następujących flag.

@property (strong, nonatomic) NSString *catName
                    __deprecated_msg("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    DEPRECATED_MSG_ATTRIBUTE("use name instead.");

//  -- Or -- 
@property (strong, nonatomic) NSString *catName
                    __attribute__((deprecated("use name instead.")));

Używając powyższych flag, możesz określić, dlaczego wycofujesz się lub jaką metodę powinien zastosować programista w przyszłości.

uiroshan
źródło
2
Wolę mieć wiadomość z ostrzeżeniem o wycofaniu. Jest to znacznie bardziej pomocne dla nowych użytkowników interfejsu API. Więc myślę, że to najlepsza odpowiedź.
johnnieb
Najbardziej podoba mi się ta odpowiedź, ponieważ jest najbardziej przejrzysta i najłatwiejsza w użyciu z kopiowaniem i wklejaniem tego, czego potrzebuję. Czy mógłbyś również rozszerzyć go o próbkę wycofania metody? cała klasa? Czy robi się to dokładnie w ten sam sposób?
Motti Shneor
15

Aby oznaczyć metodę jako przestarzałą, użyj __attribute __ ((przestarzała ("Twoja wiadomość jest tutaj")))

Praktyczny przykład z firmy Mantle

@interface NSValueTransformer (UnavailableMTLPredefinedTransformerAdditions)

+ (NSValueTransformer *)mtl_externalRepresentationTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONDictionaryTransformerWithModelClass:")));
+ (NSValueTransformer *)mtl_externalRepresentationArrayTransformerWithModelClass:(Class)modelClass __attribute__((deprecated("Replaced by +mtl_JSONArrayTransformerWithModelClass:")));

@end
onmyway133
źródło
14

Użyj deprecatedatrybutu:

- (int)bar: (int)x __attribute__((deprecated));
Stephen Canon
źródło