NSObject_底层分析

170 阅读2分钟

问题/目标分析

通过源码和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信息

3、汇编打印出内存中的真实信息。
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字节)

获取 rw 中的信息 ro,methods,properties,protocols等信息

测试实例对象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

疑问?我们找到了属性定义的位置,但每个实例中对应的属性存储在哪里?