4.类的原理分析

249 阅读1分钟

一、isa走位图和继承链

先来个经典的图,不熟悉的可以先看下 image.png

1.用代码去证明

image.png 通过地址可以看到NSObject的isa的指向是和上图中的一样的,并且isa也是有继承关系的

2.通过控制台打印

image.png 解释下:

#define ISA_MASK 0x0000000ffffffff8ULL这个是isa的掩码

p/x 打印地址

x/4gx 打印内存分布,并且第一个是isa的地址

二、类的结构内存计算

首先看下类的结构体定义 image.png 控制台打印

image.png 通过打印可以看到第二个确实是superclass NSObject

先解释下内存偏移

在objc_class结构体重的成员变量(superclass,cache,bits),想要得到bits,首地址+偏移值,就可以得到,偏移值就需要计算isa,superclass,cache

isa 8

superclass 8

cache 16

image.png

属性和方法是怎么存储的? image.png

属性:

p/x 0x100004408 + 32(首地址+偏移值 得到bits)

p (class_data_bits_t *)0x0000000100004428(类型转换)

p $2->data() (在objc_class结构体定义中看一看到class_rw_t *data() const { return bits.data(); })

最终通过 p $8.get(0) 得到属性的存储

这是property_t的结构体,所以直接可以打印出来 image.png

方法: image.png

method_t结构体 image.png 可以看到结构体big中存储的是方法名,类型,以及imp,所以通过p $15.get(2).big()得到方法。

先写到这把。。。