学习runtime之前先回顾一下isa,在arm64架构之前isa指针就是存放的Class对象的地址或者MetaClass对象的地址,arm64架构之后isa进行了优化,类型是共用体类型,isa需要&_ _ISA_MASK才是真正的地址,可以查看OC的源码进行确认
isa_t是一个共用体类型,uintptr_t 会把isa配上不同的ISA_MASK,还使用了位域存储了更多的信息,如下图所示
通过查看objc-runtime-new.h源码可以了解类的具体结构
在objc4之后,class_rw_t 会存放布局的相关信息,其中flags会存放模拟器平台、共享的缓存信息,flags里面的信息在编译之后是不会放入class_ro_t,并且从不会被使用,class_rw_ext_t(runtime时class_rw_ext_t中信息还可以修改)会存放class_ro_t_authed_ptr只读的类型的类的信息,具体可在objc-runtime-new.h中查看
class_ro_t会存放只读(此时不可更改)类的相关信息如:实例大小,方法列表,协议信息等相关的类的信息,可在objc-runtime-new.h中查看
class_rw_ext_t中包含着存放方法的数组
method_array_t类型又包含这三种类型
其中method_t是存放方法主要信息,包括方法名、类型、和方法实现的imp,method_t其中又包含两部分,大的和小的,小的通常存储在缓存中
cache_t存在于objc_class中,其具体结构为下图所示
其中bucket_t类型为哈希表,其中包含key和value,sel和imp一一对应,存放已经调用过的方法
以上为cache_t缓存的基本结构和原理