objc_direct属性简介

4,484 阅读1分钟

更多精彩文章,欢迎关注作者微信公众号:码工笔记

1. direct属性的用途

  • 减少二进制文件大小:
    • 去除了相关方法的Objective-C meta data
    • 减少了调用oc方法时的胶水代码,减少指令数
  • 提高方法调用效率
    • 减少了调用oc方法时的胶水代码,减少指令数

2. direct属性作用的对象

对象声明方式
方法声明__attribute__((objc_direct))
类实现、category、extensions__attribute__((objc_direct_memters))
属性@property (direct)

:关于__attribute__((objc_direct_memters))

  • 指定到@implementation上时,那些只在@implementation中定义(不包括在@interface中定义)的方法会成为direct方法
  • 指定到@interface上时,所有方法和属性都会成为direct

3. direct属性的实现

  • 使目标Objective-C方法变成一个纯C方法调用
    • 此方法从二进制外部不可见
    • 隐含参数(如self_cmd等)仍保留
      • 对于成员方法,编译器默认增加了对selfnil检查
      • 对于类方法,为解决类可能未被初始化的问题,增加了对[self self]的调用
      • _cmdcalling convention保持不变,调用者在调用时第二个参数不指定有意义的值,被调者在真正使用_cmd时才去读取真实的值

4. 编译期检查

  • 不允许重写或被重写的方法指定direct属性
  • 不允许类声明未指定direct但类实现指定了direct
    • 允许类声明指定但类实现未指定
  • 不允许protocol指定的方法指定direct属性
  • 不允许对id类型的对象调用direct方法
  • 不允许对direct方法使用@selector(...)

References

  • llvm commit
    • CGObjCCommonMac::EmitMessageSend

    • CGObjCCommonMac::GenerateDirectMethod

    • CGObjCCommonMac::GenerateDirectMethodPrologue

更多精彩文章,欢迎关注作者微信公众号:码工笔记