我们有我们要交付给客户的库,并且我想将某些方法标记为“已弃用”,因为我们已对其进行了更改(就像Apple在iPhone SDK中所做的那样)。
我已经看到了__OSX_AVAILABLE_BUT_DEPRECATED
预处理器宏,该宏映射到__AVAILABILITY_INTERNAL
,该宏映射到__attribute__((deprecated))
...
好吧,我对此东西有些困惑!
有人知道吗?
Answers:
__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() {
...
}
__attribute((deprecated(use method XXX instead)))
。但是此语法仅从gcc 4.5开始可用,Xcode附带的版本为4.2 ...
DEPRECATED_ATTRIBUTE
您还可以使用更具可读性的定义 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
DEPRECATED_MSG_ATTRIBUTE
标记消息不赞成使用的类(如UIAlertView)
使用以下方法弃用任何方法/类/结构/协议 @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:属性
如果您在xcode项目中使用C ++ 14,则还可以使用[[deprecated]]
or[[deprecated("reason")]]
属性,该属性现在是该语言的一部分。
请参阅文档:http : //en.cppreference.com/w/cpp/language/attributes
将此放在方法上方:
@available(*, deprecated: <#Version#>, message: <#Message#>)
例:
@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
...
}