Подтвердить что ты не робот

Как отказаться от метода в Xcode

У нас есть наша библиотека, которую мы отправляем нашим клиентам, и я хотел бы отметить некоторые методы как "устаревшие", потому что мы изменили их (например, Apple делает в iPhone SDK).

Я видел макрос препроцессора __OSX_AVAILABLE_BUT_DEPRECATED, который отображается на __AVAILABILITY_INTERNAL, который отображается на __attribute__((deprecated))...

Ну, я немного смущен этим!

Кто-нибудь знает что-то об этом?

4b9b3361

Ответ 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