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?

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

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

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.