Как мне пометить метод как устаревший в 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.")));

Используя вышеупомянутые флаги, вы можете сказать, почему вы отказываетесь от поддержки или какой метод должен использовать разработчик в будущем.

uiroshan
источник
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
onmyway133
источник
14

Используйте deprecatedатрибут:

- (int)bar: (int)x __attribute__((deprecated));
Стивен Кэнон
источник