更多精彩文章,欢迎关注作者微信公众号:码工笔记
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等)仍保留- 对于成员方法,编译器默认增加了对
self的nil检查 - 对于类方法,为解决类可能未被初始化的问题,增加了对
[self self]的调用 _cmd的calling convention保持不变,调用者在调用时第二个参数不指定有意义的值,被调者在真正使用_cmd时才去读取真实的值
- 对于成员方法,编译器默认增加了对
4. 编译期检查
- 不允许重写或被重写的方法指定
direct属性 - 不允许类声明未指定
direct但类实现指定了direct- 允许类声明指定但类实现未指定
- 不允许
protocol指定的方法指定direct属性 - 不允许对
id类型的对象调用direct方法 - 不允许对
direct方法使用@selector(...)
References
- llvm commit
-
CGObjCCommonMac::EmitMessageSend -
CGObjCCommonMac::GenerateDirectMethod -
CGObjCCommonMac::GenerateDirectMethodPrologue
-