Как мне пометить метод как устаревший в Objective-C 2.0?


142

Я являюсь частью команды, разрабатывающей довольно большое приложение для 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 я вижу, что метод помечен как устаревший, но его использование не дает предупреждения компилятору.
Memmons

1
@Answerbot Build settings> предупреждать об устаревших функциях ... установите для этого параметра YES
bandejapaisa

как добавить альтернативный метод, который следует использовать?
OXXY

135

ИМХО, проще написать __deprecated:

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

Тоже работает на занятиях

__deprecated
@interface MyDeprecatedClass

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

@end

2
Намного лучший способ сделать это.
SG1

1
Нет описания, поэтому вы не узнаете, следует ли вам использовать другой метод или какой ...
Рейстлин

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

Почему лучше чем DEPRECATED_ATTRIBUTE? Просто потому, что он короче или есть реальная разница?
kelin

89

Если вы хотите дать дополнительное сообщение с флагом устаревания, вы можете использовать следующие флаги.

@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 __ ((устаревший ("Ваше сообщение отправляется сюда")))

Практический пример из 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.