Как отказаться от метода в Xcode
У нас есть наша библиотека, которую мы отправляем нашим клиентам, и я хотел бы отметить некоторые методы как "устаревшие", потому что мы изменили их (например, Apple делает в iPhone SDK).
Я видел макрос препроцессора __OSX_AVAILABLE_BUT_DEPRECATED
, который отображается на __AVAILABILITY_INTERNAL
, который отображается на __attribute__((deprecated))
...
Ну, я немного смущен этим!
Кто-нибудь знает что-то об этом?
Ответы
Ответ 1
__attribute__((deprecated))
- это gcc way (также поддерживается в clang) для обозначения функции/метода как устаревшей. Когда кто-то помечен как "устаревший", предупреждение будет вызываться всякий раз, когда кто-либо его называет.
Синтаксис для обычных функций будет
__attribute__((deprecated))
void f(...) {
...
}
// gcc 4.5+ / clang
__attribute__((deprecated("g has been deprecated please use g2 instead")))
void g(...) {
...
}
а метод Objective-C -
@interface MyClass : NSObject { ... }
-(void)f:(id)x __attribute__((deprecated));
...
@end
Вы также можете отметить весь класс как устаревший с помощью
__attribute__((deprecated))
@interface DeprecatedClass : NSObject { ... }
...
@end
Apple также предоставляет заголовок <AvailabilityMacros.h>
, который предоставляет макросы DEPRECATED_ATTRIBUTE и DEPRECATED_MSG_ATTRIBUTE (msg), которые расширяются до указанных выше атрибутов, или ничего, если компилятор не поддерживает атрибуты. Обратите внимание, что этот заголовок не существует вне OS X/iOS.
Обратите внимание: если вы используете Swift, вы используете атрибут @available
, чтобы отклонить элемент, например
@available(*, deprecated=2.0, message="no longer needed")
func f() {
...
}
Ответ 2
Вы также можете использовать более читаемый define DEPRECATED_ATTRIBUTE
Он определен в usr/include/AvailabilityMacros.h
:
#define DEPRECATED_ATTRIBUTE __attribute__((deprecated))
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg))))
Пример Objective-C:
@interface MyClass : NSObject { ... }
-(void)foo:(id)x DEPRECATED_ATTRIBUTE;
// If you want to specify deprecated message:
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead.");
...
@end
Вы также можете отметить весь класс как устаревший:
DEPRECATED_ATTRIBUTE
@interface DeprecatedClass : NSObject { ... }
...
@end
Ответ 3
Если вы используете С++ 14 в своем проекте xcode, вы также можете использовать атрибут [[deprecated]]
или [[deprecated("reason")]]
, который теперь является частью языка.
см. документацию: http://en.cppreference.com/w/cpp/language/attributes