__attribute__((不推荐))不能在Objective-C协议方法上工作?

我需要在Objective-C协议中弃用一种方法。 在正常的类/实例方法,我添加__attribute__ ((deprecated)); 申报后。

看来,它不适用于协议方法。 如果我将它们标记为废弃,并在某处使用它们,则项目编译成OK,而不会产生预期的弃用警告。

这是苹果LLVM 3.1的缺陷,还是我做错了什么?

虽然这里的答案提供了一些非常好的信息,但它们已经过时了。 从Xcode 5.0和LLVM 5.0开始,它看起来像Objective-C协议方法的弃用警告是被识别的。 在实现该方法时,Xcode 5标记它:

警告:实施已弃用的方法

以下是我用于生成不推荐使用的协议方法的弃用警告的步骤:

  1. 将协议方法标记为不推荐使用__deprecated 。 从新的SDK 7.0文档:

    __deprecated causes编译器在遇到使用弃用function的代码时产生警告。 __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. 清理项目( + + K ),然后生成项目( + B ) – 仅仅是因为Xcode有时可能很时髦。

我并不是100%确定何时何地引入了这个function(可能使用SDK 7.0和10.9,或者Xcode 5.0 / 5.0.1,或者使用LLVM 5.0),但是它仍然有效。

那么,我刚刚意识到,即使苹果使用__attribute__((deprecated))在最后。 而且它也不起作用。 如果我使用任何废弃的委托方法,例如

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

没有任何警告。

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

编辑:提起雷达,错误ID#11849771。

Apple在UITableViewDelegate协议中不推荐使用某些方法,也许您可​​以使用Apple的代码来find解决scheme。

协议的相关代码如下:

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

正如你所看到的,苹果使用一个macros。 也许这是要走的路?

编辑:如下面的链接[1] __attribute__((deprecated))是一个GCC构造,所以这可能无法在LLVM中工作。 我想这是苹果使用macros的原因,所以当其他编译器被使用时,会调用其他(或不)的deprecation构造。

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