it-swarm.com.ru

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

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

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

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

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

75
Julien

__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() {
    ...
}
148
kennytm

Вы также можете использовать более читаемые определить 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
69
skywinder

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

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

1
Ant6n

- для быстрого кода:

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

пример:

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