Як позначити метод, як застарілий у Objective-C 2.0?


141

Я є частиною команди, яка розробляє досить великий додаток для iPad, і в результаті створено багато різних класів. Проблема полягає в тому, що деякі методи зараз досить застаріли, і я не хочу просто їх видаляти, оскільки я знаю, що деякі частини загальної системи використовують методи ... але є кращі (новіші) варіанти, які слід використовувати натомість (деякі старі насправді називають нові, але загальний інтерфейс класу стає безладним).

Чи є спосіб, коли я можу позначити певні методи як амортизовані (наприклад, @deprecatedу Java та [Obsolete].NET).

Я бачу, що Apple використовує Availability.h і має такі теги, як

__OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

... це єдиний спосіб зробити це (+ чи безпечно це для App Store?) чи є альтернативи, які позначать попередження у Xcode?

Відповіді:


163

Синтаксис депресації

Синтаксис надається для позначення методів як застарілих:

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

або:

#include <AvailabilityMacros.h>
@interface SomeClass
-method DEPRECATED_ATTRIBUTE;  // or some other deployment-target-specific macro
@end

7
Цей макрос для мене має сенс, він як би зберігає відчуття __attribute__синтаксису. #define __deprecated__ __attribute__((deprecated))
zekel

Цікаво, що Xcode не дає мені попереджень щодо використання методу, позначеного як амортизований. Чи є прапор компілятора, який потрібно встановити?
пам’ятки

У спадному коді Xcode, що випадає, я бачу, що метод позначено як амортизований, але за допомогою нього не видається попередження компілятора.
пам’ятки

1
@Answerbot Налаштування збірки> попередити про застарілі функції ... встановіть це ТАК
bandejapaisa

як додати альтернативний метод, який слід використовувати?
OXXY

135

ІМХО, простіше написати __депресовано:

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

Також працює на заняттях

__deprecated
@interface MyDeprecatedClass

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

@end

2
Набагато кращий спосіб це зробити.
SG1

1
Опис не надано, тож ви не знатимете, чи слід використовувати інший метод чи що ...
raistlin

1
#define __deprecated __attribute __ ((застаріле))
Параг Бафна

Чому це краще, ніж DEPRECATED_ATTRIBUTE? Просто тому, що вона коротша або є якась фактична різниця?
келін

88

Якщо ви хочете надіслати додаткове повідомлення із прапором анулювання, ви можете використовувати наступні прапори.

@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.")));

Використовуючи вищезазначені прапори, ви можете сказати, чому ви зневарюєте або що розробник методу повинен використовувати в майбутньому.


2
Я вважаю за краще повідомлення з попередженням про депресію. Це набагато корисніше новим користувачам API. Отже, я вважаю, що це найкраща відповідь.
johnnieb

Мені подобається ця відповідь найкраще, будучи найяснішим і найпростішим у використанні з копіювальною пастою саме того, що мені потрібно. Не могли б ви також покращити його зразком знецінення методу? цілий клас? Це робиться точно так само?
Мотті Шнеор

15

Щоб позначити метод як застарілий, використовуйте __attribute __ ((застаріле ("Ваше повідомлення йде тут")))

Практичний приклад, з Мантії

@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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.