Runtime篇
2020-10-26 本文已影响0人
清风徐来121



寻址40位就能准确寻址,非指针型isa设计是节省内存做法

局部性原理可以理解为将调用频率最高的方法放到缓存,避免到方法列表中遍历查找,提高了效率

cache_t的结构,这应该是一个bucket_t的结构体数组,mask是总数量,_occupied是已使用的数量。理论上来说,为了实现快速查找,这个bucket应该是指向一个哈希表。
struct cache_t {
struct bucket_t *_buckets;
mask_t _mask;
mask_t _occupied;
public:
struct bucket_t *buckets();
mask_t mask();
mask_t occupied();
...
}
bucket的结构,就是一个key和一个IMP,key其实就是@seletor,IMP是一个无类型的函数指针,调用方法时通过sel哈希查找快速定位到相对应的bucket_t然后对应提取出IMP




class_rw_t提供了运行时对类扩展的能力,class_ro_t存储的是类在编译时就确定的一些信息

types实际上包含了函数的返回值和参数

Runtime的基础数据结构全局图如下




打印结果都为Phone,super class只是从父类开始查找class方法,因为class实际上是在NSObject中实现的,并没有继承类重写


super的receiver指向也是self,方法的接受者


消息转发处理细节
