OC中消息传递的过程及消息转发流程
2018-10-29 本文已影响4人
没八阿哥的程序
消息传递的大致流程
- 会先从缓存中查找,采用的是哈希查找,若缓存命中,执行对应函数,若未命中,则从当前类方法列表中查找;
- 从当前类方法列表中查找,(对于已排序好的列表,采用二分查找算法查找方法对应执行函数;对于没有排序的列表,采用一般遍历查找方法对应执行函数),若当前类方法列表命中,则执行,若未命中,则从父类方法列表中查找;
- 从父类方法列表中查找,也是先查找缓存中,再查找当前类,若找到,则执行,若一直未找到,则走消息转发流程
缓存中查找
是根据对应的key进行哈希查找 ,通过哈希算法计算出IMP所在位置
当前类中查找
- 对于已排序好的列表,采用二分查找算法查找方法对应执行函数
- 对于没有排序的列表,采用一般遍历查找方法对应执行函数
父类逐级查找
父类逐级查找流程消息转发
消息转发流程- 动态方法解析(resolveInstanceMethod)
- 快速转发(forwardingTargetForSelector)
- 慢速转发(methodSignatureForSelector -> forwardInvocation)