持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
OC对象本质
首先我们需要简单了解下,oc对象本质上是struct objc_class结构体类型。struct结构分布如下:
今天我主要和大家分享下struct objc_class 中最重要的isa指针相关的理解。
老版isa指针
老版本的isa指针没有经过优化,实例对象的isa指针经过一个掩码的位运算可以获取到对应的Class对象的地址,类对象的isa指针经过位运算可以找到元类对象
进化版isa指针
union isa_t 联合体结构图如下
关于位域
上图中struct的成员中类型后面跟着 冒号+数字n,这就表示这个属性使用n个bit(位),比如一个bool型的只需要0或者1就可以表示,用1个二进制位就可以表示。这样这个struct就比较省内存,只需要64位即8个字节就可以放得下。在OC底层使用位域可以大大优化内存的使用。
关于union
有些同学可能对联合体union这个类型有点陌生,这里解释一下: 如果一片内存是union类型的,如上图的isa_t,操作系统分配给isa_t一片内存8个字节64位,你既可以把它当作一个Class指针,又可以把它当作一个uintptr_t,还可以把它当作一个struct来读取。其实struct部分就是为了更加清晰的表述这个union类型的内存64位代表的含义,在程序运行过程中拿到isa指针之后经过位运算就可以确定这个isa指针的某些属性。