Як застаріти метод у 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() {
    ...
}

Дякую за цю швидку відповідь, я майже впевнений, що це допоможе, я шукав якийсь час, перш ніж запитати :)
Жюльєн

1
У мене просто ще одне запитання: чи можна додати повідомлення типу "Використати замість цього метод XXX"?
Жульєн

22
@Julien: Так: __attribute((deprecated(use method XXX instead))). Але цей синтаксис доступний лише починаючи з gcc 4.5, а версія, що постачається з Xcode, складає 4.2 ...
kennytm

Якщо я додаю застарілий атрибут лише до оголошення методу, компілятор говорить "Атрибути при реалізації методу і його оголошення має збігатися". Чи потрібно додавати smth до реалізації методу?
Борут Томазін

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

2
Це те, як Apple робить це і в класах iOS. Можливо, кращий метод.
LunaCodeGirl

2
Це, безумовно, кращий метод. Шкода, що це не вибрана відповідь, або відповідь, яка проголосувала вище.
Benjohn

як я можу використовувати DEPRECATED_MSG_ATTRIBUTEдля позначення класу як застарілого за допомогою повідомлення (наприклад, UIAlertView)
Multinerd

1
Чи існує поняття "перейменовано", подібне до доступних атрибутів у Swift?
Джо Суснік,

5

Свіфт 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]]or, [[deprecated("reason")]]який зараз є частиною мови.

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


0

- ДЛЯ SWIFT-КОДУ:

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

приклад:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.