objc_msgSend慢速查找过程

前言:我们前面通过方法的本质,了解到了objc_msgSend函数的一个快速缓存查找过程,如果在进行快速查找,寻找不到IMP的情况下,查找过程并不会结束,而是会开始另外一个过程————慢速查找过程。那么接下来就让我们通过一系列的分析,来了解objc_msgSend的慢速查找过程!

一、objc_msgSend过程回顾

我们在进行消息发送的时候,会调用objc_msgSend(receiver,_cmd)方法进行消息的发送,其中receiver是消息的接受者,_cmd是消息的内容。如下:

Person *p = [Person alloc];
[p test];

//转化为cpp
Person *p = ((Person *objc_msgSend(objc_getClass("Person"), sel_registerName("alloc")); 
objc_msgSend(p, sel_registerName("test"));    
复制代码

1、objc_msgSend快速查找回顾

1、通过类找到isa

2、拿到isa通过偏移量找到cache_t

3、然后拿到存储方法的buckets,尝试通过哈希数组拿到bucket中的方法IMP

4、如果获取到就返回,如果找不到就继续遍历其他的bucket

5、最后进入慢速查找过程。

2、objc_msgSend慢速查找

这里,我们要从一个函数说起 ———— lookUpImpOrForward

二、objc_msgSend慢速查找解析

整体思路:
1、先判断类是否存在,不存在,返回空,否则继续,

2、查找类自己的缓存(class’s cache),找到IMP就返回,否则就继续,

3、查找类自己的方法列表(class’s method lists),找到就返回IMP,否则继续,

4、查找父类的缓存(superclass)和方法列表(method lists),找到返回IMP,否则继续

5、如果找到IMP,且IMP不是本类的IMP,就将父类的IMP缓存拷贝到自己的cache下一份使用,

6、如果没有IMP,则执行动态消息解析和消息转发流程。

更新中…

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享