Как отмечать метод как устаревший в 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?
Ответы
Ответ 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