objc_direct_members在Xcode 11.4测试版中不起作用



我正在尝试使用Clang的新objc_direct_members

__attribute__((objc_direct_members))
@implementation ViewController
...
@end

然而,编译器告诉我warning: 'objc_direct_members' attribute isn't implemented by this Objective-C runtime。无论我是为arm64还是x86_64构建,它都会执行此操作。可能是什么问题?

在我们被诸如"为什么需要objc_direct_members?"之类的问题转移话题之前,我只想说有很多原因,比如由于objc元数据较少而导致二进制大小较小。

__attribute__((objc_direct_members))同时需要编译器支持和运行时支持。正如错误消息告诉您的那样,Xcode 11.4的SDK中的运行时在运行时中不支持它,因此编译器无法使用它,因为它本身无法实现这一点。LLVM开发人员在编译器中添加了这样的功能,但他们不是管理Objective-C运行时的人,这是由苹果完成的,而且只有苹果完成,除非你想使用替代的Obj-C运行时,但LLVM没有自己的运行时。除非你的系统提供了运行时,否则你根本不能在clang中使用Obj-C

我只想说有很多原因诸如由于较少的ObjC元数据而导致较小的二进制大小。

除非你的项目很小,否则这实际上是可以忽略的。使用它的理由是:

  • 大大减少了调用开销(与调用C函数一样低(
  • 这些方法没有公开的符号
  • 没有办法意外地覆盖";私人的";方法(Obj-C没有私有方法,但可以有一个不由接口公开的方法(
  • 无法调用私有方法

不幸的是,最后一个方法使在单元测试中测试这些方法变得不可能。

最新更新