Как осудить метод в Xcode - PullRequest
       32

Как осудить метод в Xcode

76 голосов
/ 07 февраля 2011

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

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

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

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

Ответы [ 5 ]

148 голосов
/ 07 февраля 2011

__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() {
    ...
}
70 голосов
/ 07 июля 2014

Вы также можете использовать более читабельный определить 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
1 голос
/ 08 августа 2016

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

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

0 голосов
/ 30 мая 2019

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 Doc: Атрибуты

0 голосов
/ 01 января 2019

- ДЛЯ SWIFT-кода:

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

пример:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
...