如何在iOS Objective-C头文件中标记一个函数已被弃用?

43

我该如何在 iOS Objective-C 的头文件中将函数标记为已弃用?

我猜在函数后面会有一些关键字可以使用?

我想要生成编译器警告,防止任何人尝试使用已弃用的函数,就像在 Apple 的 API 中看到的行为一样。


嘿gs - 很好的评论。我刚刚也在想这个! - Nick Cartwright
5个回答

62
尝试在你的方法声明中追加一个属性:
- (void)fooBar __attribute__ ((deprecated));

内容摘自这里


1
看起来语法有点丑陋,但只要能工作就行!谢谢Tim。 - Nick Cartwright
3
你可以使用"#define DEPRECATED attribute ((deprecated))"来标记过时的内容。 - Denis Mikhaylov
16
  • (void)fooBar DEPRECATED_ATTRIBUTE; 这个对我有用。我认为你不需要像Denis建议的那样使用#define,因为据我所知它已经被定义了。
- pshah
13
你可以使用 "__deprecated" 来表示已过时。 - ArtFeel
1
这个定义在cdefs.h中。 - ArtFeel
显示剩余3条评论

15

你可以使用 <cdefs.h> 中定义的宏,而不是使用__attribute__((deprecated)):

- (void)fooBar __deprecated;
// Or better:
- (void)fooBar __deprecated_msg("Use barFoo instead.");

或者你可以使用在<AvailabilityMacros.h>中定义的宏:

- (void)fooBar DEPRECATED_ATTRIBUTE;
// Or better:
- (void)fooBar DEPRECATED_MSG_ATTRIBUTE("Use barFoo instead.");
如果您使用的是Objective-C,那么由于您将使用现代编译器,因此可以选择苹果短语法__deprecated_msg(),这没有任何区别。但是如果您使用C进行跨平台开发,则DEPRECATED_MSG_ATTRIBUTE()使用最佳可用性定义(例如,它支持GCC3.1)。

7

Tim的回答实际上会产生编译警告;其他版本只是注释,对于编译器没有影响。

如果你查看 /usr/include/AvailabilityMacros.h,你会看到苹果是如何做到这一点的。该头文件使用 __attribute__((deprecated))__attribute__((unavailable)),具体取决于API是否存在但已弃用,或者已从操作系统中删除。


2

以下内容来自苹果公司的SFAuthorization.h文件:

/*!
DEPRECATED: Use obtainWithRight:flags:error:
@method permitWithRight:flags:
@abstract Call permitWithRight to gain a right to have
          access to a privilege operation.
@param rightName The name of an authorization right.
@param flags Authorization flags.
*/
- (OSStatus)permitWithRight:(AuthorizationString)rightName
                      flags:(AuthorizationFlags)flags;

如果您没有使用自动化文档生成器,我建议您可以这样写:
- (void)doSomething;           /* DEPRECATED */

谢谢您的评论。如果我在SFAuthorization中使用'permitWithRight'函数,会得到编译器警告...有没有一种方法可以添加弃用标志以发出编译器警告? - Nick Cartwright
你可以使用预处理器的命令 #warning,但它不是标准的,并且可能无法在所有编译器中工作。请参见https://dev59.com/EHVC5IYBdhLWcg3w1E1q - Georg Schölly

2
您还可以参考HeaderDoc手册。该语法用于:
/*!
 * @abstract Foo is good for bar.
 *
 * @deprecated in version 2.0
 */

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接