如何在Xcode中弃用方法


79

我们有我们要交付给客户的库,并且我想将某些方法标记为“已弃用”,因为我们已对其进行了更改(就像Apple在iPhone SDK中所做的那样)。

我已经看到了__OSX_AVAILABLE_BUT_DEPRECATED预处理器宏,该宏映射到__AVAILABILITY_INTERNAL,该宏映射到__attribute__((deprecated))...

好吧,我对此东西有些困惑!

有人知道吗?

Answers:


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

谢谢您的快速回答,我敢肯定它会有所帮助,我在询问之前搜索了一段时间:)
Julien

1
我还有一个问题:是否可以添加“使用方法XXX”之类的消息?
朱利安

22
@Julien:是的__attribute((deprecated(use method XXX instead)))。但是此语法仅从gcc 4.5开始可用,Xcode附带的版本为4.2 ...
kennytm 2011年

如果仅在方法声明中添加不推荐使用的属性,则编译器会说“方法实现的属性及其声明必须匹配”。我需要在方法实现中添加smth吗?
Borut Tomazin'4

2
这不应该是公认的答案。这不是苹果的做法,而且比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 2015年

2
绝对是更好的方法。可惜不是选定的答案,还是投票率较高的答案。
约翰

我如何使用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 doc:属性



0

-对于SWIFT代码:

将此放在方法上方: @available(*, deprecated: <#Version#>, message: <#Message#>)

例:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.