我需要弃用 Objective-c 协议中的单个方法。__attribute__ ((deprecated));
在声明后添加的普通类/实例方法上。
看来,它不适用于协议方法。如果我将它们标记为已弃用并在某处使用它们,则项目编译正常,没有预期的弃用警告。
这是 Apple LLVM 3.1 中的一个缺陷,还是我做错了什么?
我需要弃用 Objective-c 协议中的单个方法。__attribute__ ((deprecated));
在声明后添加的普通类/实例方法上。
看来,它不适用于协议方法。如果我将它们标记为已弃用并在某处使用它们,则项目编译正常,没有预期的弃用警告。
这是 Apple LLVM 3.1 中的一个缺陷,还是我做错了什么?
尽管这里的答案提供了一些非常好的信息,但它们已经过时了。从 Xcode 5.0 和 LLVM 5.0 开始,Objective-C 协议方法的弃用警告似乎已被识别。在实现该方法时,Xcode 5 会对其进行标记:
警告:实施已弃用的方法
以下是我为实现已弃用的协议方法生成弃用警告的步骤:
使用 . 将协议方法标记为已弃用__deprecated
。从新的 SDK 7.0 文档中:
__deprecated causes
编译器在遇到使用已弃用功能的代码时产生警告。__deprecated_msg()
做同样的事情,支持它的编译器将打印一条消息以及弃用警告。-Wdeprecated
这可能需要使用标志打开此类警告。__deprecated_enum_msg()
应该在枚举上使用,支持它的编译器将打印弃用警告。
#define __deprecated __attribute__((deprecated))
要弃用您的方法,请执行以下操作:
- (void)aDeprecatedProtocolMethod __deprecated;
仅此一项就足以让 Xcode 显示弃用警告。但是,您应该遵循接下来的几个步骤(知道 Xcode 有时可能非常挑剔)以确保显示警告。
添加带有弃用警告标签的文档注释。请参阅下面的代码示例以了解如何:
/** 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;
清理项目(⌘</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) - 但它仍然有效。
好吧,我刚刚意识到,即使是苹果__attribute__((deprecated))
最终也会使用。它也不起作用。如果我使用任何不推荐使用的委托方法,例如
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
没有警告。
所以它似乎是雷达的候选者。
编辑:提交了一个雷达,Bug ID# 11849771。
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 使用宏的原因,因此在使用其他编译器时会调用其他一些(或没有)弃用构造。