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

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

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

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

有人知道吗?

【问题讨论】:

    标签: objective-c xcode cocoa cocoa-touch 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 {
            ...
        }
        

        【讨论】:

          猜你喜欢
          • 2012-04-23
          • 1970-01-01
          • 2013-09-04
          • 1970-01-01
          • 1970-01-01
          • 2020-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多