问题/目标分析
通过源码和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