如何弃用Xcode中的方法

Jul*_*ien 77 xcode cocoa cocoa-touch objective-c deprecated

我们将我们的库提供给客户,我想将一些方法标记为"已弃用",因为我们更改了它们(就像Apple在iPhone SDK中所做的那样).

我已经看到了__OSX_AVAILABLE_BUT_DEPRECATED映射到的预处理器宏__AVAILABILITY_INTERNAL,它被映射到__attribute__((deprecated))......

好吧,我对这些东西有点困惑!

有谁知道这件事?

ken*_*ytm 149

__attribute__((deprecated))将函数/方法标记为已弃用的gcc方式(在clang中也支持).当一个被标记为"已弃用"时,每当有人调用它时都会产生警告.

正常函数的语法是

__attribute__((deprecated))
void f(...) {
  ...
}

// gcc 4.5+ / clang
__attribute__((deprecated("g has been deprecated please use g2 instead")))
void g(...) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

而Objective-C方法则是

@interface MyClass : NSObject { ... }
-(void)f:(id)x __attribute__((deprecated));
...
@end
Run Code Online (Sandbox Code Playgroud)

您还可以将整个类标记为已弃用

__attribute__((deprecated))
@interface DeprecatedClass : NSObject { ... }
...
@end
Run Code Online (Sandbox Code Playgroud)

Apple还提供了<AvailabilityMacros.h>标头,该标头提供了扩展为上述属性的DEPRECATED_ATTRIBUTE和DEPRECATED_MSG_ATTRIBUTE(msg)宏,如果编译器不支持属性,则不提供任何内容.请注意,此标头在OS X/iOS之外不存在.


旁注,如果您使用Swift,则使用该@available属性来弃用项目,例如

@available(*, deprecated=2.0, message="no longer needed")
func f() {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @Julien:是的:`__ attribute((不建议使用(使用方法XXX)))`.但是这种语法只能从gcc 4.5开始提供,而Xcode附带的版本是4.2 ... (22认同)
  • 这不应该是公认的答案.Apple不是这样做的,而且它比'DEPRECATED_ATTRIBUTE`更丑陋 (2认同)

sky*_*der 72

您还可以使用更易读的定义 DEPRECATED_ATTRIBUTE

它定义于usr/include/AvailabilityMacros.h:

#define DEPRECATED_ATTRIBUTE        __attribute__((deprecated))
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg))))
Run Code Online (Sandbox Code Playgroud)

Objective-C方法示例:

@interface MyClass : NSObject { ... }
-(void)foo:(id)x DEPRECATED_ATTRIBUTE;

// If you want to specify deprecated message:
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead.");
...
@end
Run Code Online (Sandbox Code Playgroud)

您还可以将整个类标记为已弃用:

DEPRECATED_ATTRIBUTE
@interface DeprecatedClass : NSObject { ... }
...
@end
Run Code Online (Sandbox Code Playgroud)

  • 这就是Apple在iOS课程中的表现方式.可能是更好的方法. (2认同)
  • 这绝对是更好的方法.遗憾的是,这不是选定的答案,也不是更高的投票答案. (2认同)

Lal*_*hna 10

斯威夫特 5.0

使用弃用任何方法/类/结构/协议 @available

@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }

@available(*, deprecated, renamed: "loadData")
func fetchData() { }

@available(swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }

@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")
Run Code Online (Sandbox Code Playgroud)

可能的参数:

  • 介绍
  • 已弃用
  • 过时的
  • 信息
  • 更名

有关更多信息,请参阅苹果文档:属性