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

79

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

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

Ну, я немного запутался в этом!

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

Жюльен
источник

Ответы:

150

__attribute__((deprecated))- это способ gcc (также поддерживаемый в 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() {
    ...
}
Kennytm
источник
Спасибо за этот быстрый ответ, я почти уверен, что это поможет, я искал некоторое время, прежде чем спросить :)
Жюльен
1
У меня просто еще один вопрос: можно ли добавить сообщение типа «Вместо этого используйте метод XXX»?
Жюльен
22
@Julien: Да: __attribute((deprecated(use method XXX instead))). Но этот синтаксис доступен только начиная с gcc 4.5, а версия, поставляемая с Xcode, - это 4.2 ...
kennytm
Если я добавляю устаревший атрибут только в объявление метода, компилятор говорит: «Атрибуты реализации метода и его объявление должны совпадать». Нужно ли мне что-то добавить в реализацию метода?
Борут Томазин
2
Это не должен быть принятый ответ. Apple делает это не так, и это намного уродливее, чемDEPRECATED_ATTRIBUTE
Адлай Холлер
74

Вы также можете использовать более читаемое определение 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
Skywinder
источник
2
То же самое делает Apple и в классах iOS. Наверное, лучший метод.
LunaCodeGirl
2
Это определенно лучший метод. Жалко, что это не выбранный ответ или ответ, получивший более высокую оценку.
Benjohn
как я могу использовать, DEPRECATED_MSG_ATTRIBUTEчтобы пометить класс как устаревший с сообщением (например, UIAlertView)
Multinerd
1
Есть ли концепция «переименования», аналогичная доступным атрибутам в Swift?
Джо Сусник
5

Swift 5.0

Устарели любые методы / классы / структуры / протоколы с использованием @available

@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }

@available(*, deprecated, renamed: "loadData")
func fetchData() { }

@available(swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }

@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")

Возможные параметры:

  • представил
  • устарел
  • устаревший
  • сообщение
  • переименован

Для получения дополнительной информации см. Документ Apple: Атрибуты

Лал Кришна
источник
1

Если вы используете C ++ 14 в своем проекте xcode, вы также можете использовать атрибут [[deprecated]]или, [[deprecated("reason")]]который теперь является частью языка.

см. документацию: http://en.cppreference.com/w/cpp/language/attributes

Ant6n
источник
0

- ДЛЯ SWIFT КОДА:

Поместите это прямо над методом: @available(*, deprecated: <#Version#>, message: <#Message#>)

пример:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
Моджтаба Хоссейни
источник