__attribute__((不建议使用))不适用于Objective-C协议方法?
我需要弃用objective-c协议中的单个方法。在正常的类/实例方法中,我在声明后添加__attribute__ ((deprecated));
。__attribute__((不建议使用))不适用于Objective-C协议方法?
看来,它不适用于协议方法。如果我将它们标记为废弃并在某处使用它们,则项目编译成OK,而不会产生预期的弃用警告。
这是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;
清理项目(⌘ + ⇧ + ķ),然后生成项目(⌘ + 乙) - 只是因为Xcode有时可能很时髦。
我不是100%确定何时何地被引入这个功能(可能与SDK 7.0和10.9,或Xcode中5.0/5.0.1,或LLVM 5.0) - 但它仍然工作。
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中工作。我猜这是苹果使用宏的原因,所以当其他编译器被使用时,其他一些(或不)弃用构造将被调用。
宏扩展为'__attribute __((availability(ios,introduced = 2.0,deprecated = 3.0)))''。请参阅'Availability.h'和'AvailabilityInternal.h'(均在'/ usr/include /'中) – JustSid 2012-07-11 14:47:13
是的,他们谈论的是GCC,但__attribute __((不推荐))实际上在Apple LLVM上工作,除协议外。目前这令人困惑。 – 2012-07-11 15:07:07
好了,我才意识到,即使苹果公司使用__attribute__((deprecated))
末。而且它也不起作用。如果我使用任何不推荐的委托方法,例如
- (UITableViewCellAccessoryType)tableView:(UITableView *)tableView
accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
没有警告。
所以它看起来像雷达的候选人。
编辑:提起雷达,错误编号11849771.
关于“Bug ID#11849771”的任何更新? – Vasu 2013-01-23 05:51:30
不幸的是,没有 – 2013-01-25 13:54:22
这仍然发生在LLVM 5.0中。虽然编译器不显示警告,但在使用Xcode自动完成时,它会用红线将该方法划掉。对此有何言论? – 2013-11-24 19:59:29