我需要弃用objective-c协议中的单个方法。在普通的类/实例方法中,我在声明后添加__attribute__ ((deprecated));
。
似乎它不适用于协议方法。如果我将它们标记为已弃用并在某处使用它们,则项目编译正常,而不会出现预期的弃用警告。
这是Apple LLVM 3.1中的一个缺陷,还是我做错了什么?
答案 0 :(得分:7)
虽然这里的答案提供了一些非常好的信息,但它们已经过时了。从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;
清理项目(⌘ + ⇧ + K )然后构建项目(⌘ + B ) - 只是因为Xcode有时会很时髦。
我不是100%确定何时或何地引入此功能(可能使用SDK 7.0和10.9,或Xcode 5.0 / 5.0.1,或使用LLVM 5.0) - 但它仍然有用。
答案 1 :(得分:4)
嗯,我刚才意识到,即使Apple最后也会使用__attribute__((deprecated))
。它也不起作用。如果我使用任何弃用的委托方法,例如
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
没有警告。
所以它似乎是雷达的候选人。
编辑:提交雷达,错误ID#11849771。答案 2 :(得分: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使用宏的原因,因此在使用其他编译器时会调用其他一些(或没有)弃用结构。