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

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

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

4b9b3361

Ответ 1

Синтаксис устаревания

Синтаксис предоставляется для обозначения методов как устаревших:

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

или

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

Ответ 2

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

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

Работает тоже по классам

__deprecated
@interface MyDeprecatedClass

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

@end

Ответ 3

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

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

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

Ответ 4

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

- (int)bar: (int)x __attribute__((deprecated));

Ответ 5

Чтобы пометить метод как устаревший, используйте __ атрибут __ ((устарело ( "Ваше сообщение идет здесь" )))

Практический пример, из Мантии

@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