如何在 Xcode 中弃用方法

Posted

技术标签:

【中文标题】如何在 Xcode 中弃用方法【英文标题】:How to deprecate a method in Xcode 【发布时间】:2011-06-22 21:31:01 【问题描述】:

我们将库发给客户,我想将一些方法标记为“已弃用”,因为我们更改了它们(就像 Apple 在 iPhone SDK 中所做的那样)。

我见过__OSX_AVAILABLE_BUT_DEPRECATED预处理器宏,它映射到__AVAILABILITY_INTERNAL,它映射到__attribute__((deprecated))...

嗯,我对这些东西有点困惑!

有人知道吗?

【问题讨论】:

【参考方案1】:

__attribute__((deprecated)) 是将函数/方法标记为已弃用的gcc way(也称为supported in 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 attribute 来弃用某个项目,例如

@available(*, deprecated=2.0, message="no longer needed")
func f() 
    ...

【讨论】:

感谢您的快速回答,我很确定它会有所帮助,我在询问之前搜索了一段时间:) 我还有一个问题:是否可以添加类似“使用方法 XXX 代替”的消息? @Julien:是的:__attribute((deprecated(use method XXX instead)))。但是这种语法只能从 gcc 4.5 开始使用,Xcode 附带的版本是 4.2... 如果我只在方法声明中添加不推荐使用的属性,编译器会说“方法实现的属性及其声明必须匹配”。我需要在方法实现中添加 smth 吗? 这不应该是公认的答案。这不是苹果怎么做的,比DEPRECATED_ATTRIBUTE丑多了【参考方案2】:

你也可以使用更具可读性的defineDEPRECATED_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

【讨论】:

这也是 Apple 在 iOS 类中的做法。可能是更好的方法。 这绝对是更好的方法。可惜不是选定的答案,也不是投票率较高的答案。 我如何使用DEPRECATED_MSG_ATTRIBUTE 将一个类标记为已弃用的消息(如 UIAlertView) 是否有类似于 Swift 中可用属性的“重命名”概念?【参考方案3】:

斯威夫特 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.")

可能的参数:

介绍 已弃用 已过时 留言 重命名

欲了解更多信息,请参阅苹果文档:Attributes

【讨论】:

【参考方案4】:

如果您在您的 xcode 项目中使用 C++14,您还可以使用该语言现在包含的 [[deprecated]][[deprecated("reason")]] 属性。

查看文档:http://en.cppreference.com/w/cpp/language/attributes

【讨论】:

【参考方案5】:

- 对于 SWIFT 代码:

把它放在方法的正上方: @available(*, deprecated: <#Version#>, message: <#Message#>)

示例:

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

【讨论】:

以上是关于如何在 Xcode 中弃用方法的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 实例 ID:在 21.0.0 中弃用 getId()

如何在 API 29 中弃用 getExternalStorageDirectory 时读取或写入文件?

UIAlertView 已弃用:首先在 iOS 9.0 中弃用 - UIAlertView 已弃用。将 UIAlertController 与首选样式一起使用

在 rails 3 中弃用 after_save 解决方案

thumbnailImageAtTime:timeOption 已弃用:首先在 iOS 7 中弃用

iOS - 系统方法中弃用的关键字的了解 NS_AVAILABLE和NS_DEPRECATED