前言:我们前面通过方法的本质,了解到了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