2012-07-11 62 views
12

我需要弃用objective-c协议中的单个方法。在正常的类/实例方法中,我在声明后添加__attribute__ ((deprecated));__attribute__((不建议使用))不适用于Objective-C协议方法?

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

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

+0

这仍然发生在LLVM 5.0中。虽然编译器不显示警告,但在使用Xcode自动完成时,它会用红线将该方法划掉。对此有何言论? – 2013-11-24 19:59:29

回答

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. 清理项目( + + ķ),然后生成项目( + ) - 只是因为Xcode有时可能很时髦。

我不是100%确定何时何地被引入这个功能(可能与SDK 7.0和10.9,或Xcode中5.0/5.0.1,或LLVM 5.0) - 但它仍然工作。

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); 

正如你可以看到,苹果采用的宏。也许这是要走的路?

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

[1] How to deprecate a method in Xcode

+0

宏扩展为'__attribute __((availability(ios,introduced = 2.0,deprecated = 3.0)))''。请参阅'Availability.h'和'AvailabilityInternal.h'(均在'/ usr/include /'中) – JustSid 2012-07-11 14:47:13

+0

是的,他们谈论的是GCC,但__attribute __((不推荐))实际上在Apple LLVM上工作,除协议外。目前这令人困惑。 – 2012-07-11 15:07:07

4

好了,我才意识到,即使苹果公司使用__attribute__((deprecated))末。而且它也不起作用。如果我使用任何不推荐的委托方法,例如

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

没有警告。

所以它看起来像雷达的候选人。

编辑:提起雷达,错误编号11849771.

+0

关于“Bug ID#11849771”的任何更新? – Vasu 2013-01-23 05:51:30

+0

不幸的是,没有 – 2013-01-25 13:54:22