一个实例对象调用方法的调用过程
- 编译 -> 变成 objc_msgSend(id,SEL,...)
- 根据示例对象的 isa 指针,找到该对象的 Class
- 在 Class 中根据 SEL 方法名寻找函数实现 IMP
寻找过程
- 先在当前类的 cache 中查找
- 如果 cache 中没找到,就去当前类的 methodLists 列表中查找,最后根据 super class 找到父类
- 在父类的 methhodLists 中查找,直到找到 NSObject 为止,如果找到就根据找到的 IMP 去执行,
- 如果没找到就去执行消息转发流程
为什么先去找 cache
如果每次都去 methodLists 中去查找,效率会很低,所以所有调用过的方法都会以 map 的方式保存在 cache 中,提高查找效率。
网友评论