如何在 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 与首选样式一起使用