12

我需要弃用 Objective-c 协议中的单个方法。__attribute__ ((deprecated));在声明后添加的普通类/实例方法上。

看来,它不适用于协议方法。如果我将它们标记为已弃用并在某处使用它们,则项目编译正常,没有预期的弃用警告。

这是 Apple LLVM 3.1 中的一个缺陷,还是我做错了什么?

4

3 回答 3

7

尽管这里的答案提供了一些非常好的信息,但它们已经过时了。从 Xcode 5.0 和 LLVM 5.0 开始,Objective-C 协议方法的弃用警告似乎已被识别。在实现该方法时,Xcode 5 会对其进行标记:

警告:实施已弃用的方法

以下是我为实现已弃用的协议方法生成弃用警告的步骤:

  1. 使用 . 将协议方法标记为已弃用__deprecated。从新的 SDK 7.0 文档中:

    __deprecated causes编译器在遇到使用已弃用功能的代码时产生警告。__deprecated_msg()做同样的事情,支持它的编译器将打印一条消息以及弃用警告。-Wdeprecated这可能需要使用标志打开此类警告。__deprecated_enum_msg()应该在枚举上使用,支持它的编译器将打印弃用警告。

    #define __deprecated    __attribute__((deprecated))
    

    要弃用您的方法,请执行以下操作:

    - (void)aDeprecatedProtocolMethod __deprecated;
    

    仅此一项就足以让 Xcode 显示弃用警告但是,您应该遵循接下来的几个步骤(知道 Xcode 有时可能非常挑剔)以确保显示警告。

  2. 添加带有弃用警告标签的文档注释。请参阅下面的代码示例以了解如何:

    /** Describe the method here - what does it do, how does it work, etc. Very brief.
        @deprecated This delegate method is deprecated starting in version 2.0, please use otherMethodNameHere:withAnExtraParameter: instead. */
    - (void)aDeprecatedProtocolMethod __deprecated;
    
  3. 清理项目(⌘</kbd>+⇧</kbd>+K) and then Build the project (⌘</kbd>+B) - just because Xcode can be funky sometimes.

我不能 100% 确定何时何地引入此功能(可能使用 SDK 7.0 和 10.9,或 Xcode 5.0 / 5.0.1,或使用 LLVM 5.0) - 但它仍然有效。

于 2014-01-20T23:31:57.453 回答
4

好吧,我刚刚意识到,即使是苹果__attribute__((deprecated))最终也会使用。它也不起作用。如果我使用任何不推荐使用的委托方法,例如

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
     accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath

没有警告。

所以它似乎是雷达的候选者。

编辑:提交了一个雷达,Bug ID# 11849771。

于 2012-07-11T15:18:09.147 回答
3

Apple 弃用了 UITableViewDelegate 协议中的一些方法,也许您可​​以使用 Apple 的代码作为示例找到解决方案。

协议相关代码如下:

- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
         accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
 __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_3_0);

如您所见,Apple 使用宏。也许这是要走的路?

编辑:正如以下链接 [1]__attribute__((deprecated))中所述,它是一个 GCC 结构,因此这在 LLVM 中可能不起作用。我想这就是 Apple 使用宏的原因,因此在使用其他编译器时会调用其他一些(或没有)弃用构造。

[1]如何在 Xcode 中弃用方法

于 2012-07-11T14:38:34.087 回答