iOS开发-Runtime底层分析

218 阅读1分钟

说明

runtime核心:lookUpImpOrForword

调用方法本质是消息查找 objc_msgSend imp

底层调用:objc_msgSend(t,test);

查找类

根据isa查找类对象,isa_t为结构体,通过当中的ISA_MASK和掩码的位运算找到类的地址信息

查找方法

查找缓存方法

1.objc_class结构体中的cache_t(方法缓存),地址偏移计算出  buckets->sel&_mask=index(hash表中的索引)->_buckets+(sel&mask)->imp->sel->缓存命中

查找方法(objc_msgSend_uncached)

1.遍历方法列表(mothod_t)

2.继承链当中superClass遍历查找

3.若直至NSObject仍无遍历出方法进入动态方法解析

动态方法解析(本质就是提供机会)

1.resloveIntancesMethod,修正自身错误,动态的添加一个方法,方法列表当中(SEL-IMP)建立新的绑定关系,IMP需自己设定并处理未找到方法的情况

标准消息转发(obj_msgForword)

1.forwordTargetForSelector 寻找接收者

2.forwordInvocation 直接舍弃