前言
本文的主要目的是分析 类 & 类的结构,整篇都是围绕一个类展开的一些探索
类的结构
- isa
- superclass
- cache
- 缓存方法
- bits
- 成员变量
- 属性
- 方法
- 协议
isa走位 & 继承关系 图
探索过程
- 获取类的地址 (x/p LGPerson.class)
- LLDB 调试只能看到类中有一个isa,查看源码会发现有继承objc_object 的isa 、Class superclass 、cache_t cache、class_data_bits_t bits
- 获取通过内存偏移可以获取到 cache_t 和 class_data_bits_t
- 偏移16个字节可以拿到 cache_t
- 偏移32个字节可以拿到 class_data_bits_t
- class_data_bits_t 的结构中有一个class_rw_t 里面存着属性、成员变量、对象方法, 这些都是通过方法去获取到的
class_data_bits_t->data() p *$x p $x.properties() p $x.list p $x.ptr p $x.get(0)
class_data_bits_t->data() p *$x p $x.methods() p $x.list p $x.ptr p *$x p $x.get(0).big()
class_data_bits_t->data() p *$x p $x.methods() p $x.list p $x.ptr p *$x p $x.get(0).big()
class_data_bits_t->data() p $2.protocols() p $3.list p $4.ptr p *$5 p/x $6.list[0] p (protocol_t *)0x0000000100008818 p $13.mangledName
- 类方法存着在元类里面
- cache_t 缓存方法, 待更新...