问题/目标分析
通过源码和lldb调试,寻找内存中各种不同类型的NSObject对象,各个字段对应的信息。
方法分析
构建测试类型BLPerson。
包含成员变量nikename,属性pro_name,实例方法walk,类型方法classwalk。
使用lldb 和objc源码来分析底层数据原理。分别测试 实例对象person,类型对象pclass,以及metaclass.(metaclass解释)

实验步骤
1、找到源码中最底层类objc_object,其中包含isa(isa信息)

2、找到第二层objc_class,包含superclass,cache,bits.
其中superclass为super指针信息,看super信息

cache类型
_buckets,指针8字节_mask,_occupied, mask_t类型 为 uint32_t,4字节总共16字节

在所以cache 占位16字节,在 x/4xg 模式下观察。

4、bits
通过x/4xg 指令打印出bits中的data,称作rw信息。(bits的地址在cathe后面,所以是catch地址+16字节)





测试实例对象person
发现在person中 rw 的method,和property信息为空

测试类型对象pclass
在class对象中,rw可以读取到实例方法walk和属性pro_name,(类型方法classwalk无法读取)(成员变量nikename无法读取)。


测试metaclass
根据isa 找到metaclass,测试metaclass,可以找到类型方法 classwalk。

疑问?
通过isa指针和rw信息我们找到了,属性pro_name,实例方法walk,类型方法classwalk。但是成员变量nikename,并没有找到。下面开始寻找nikename.
rw-> ro
现在观察rw中的ro,


ro 中的baseProperties
person中ro->baseproperties 无信息

pclass中ro->baseproperties 只有pro_name

metaclass中ro->baseproperties 无信息

ro 中的ivars
person中ivars 无信息

pclass中ivars 找到了 nikename,_pro_name,(这里内部变量做了转换但可以看到)

metaclass中ivars 无信息
结果分析
通过对源码和lldb调试,我们找到了定义在BLPerson中成员变量nikename,属性pro_name,实例方法walk,类型方法classwalk
总结实验
在内存中,各个属性和方法的定义在:
实例对象:
无定义
class:
methods->实例方法walk
properties->属性pro_name
ro->ivar:成员变量nikename ,属性_pro_name
metaclass:
methods->类型方法classwalk