objc_class: 结构体cache存储了方法列表
方法是如何查找的呢?
从cache_t来读取方法 从这俩方法里读取
objc_msgSend的几种调用方式
objc_msgSend 与objc_msgSendSuper的区别是什么?
- 查找方法的对象不一样,
- 前者是实例对象的类对象
- 后者是实例对象的父类的类对象
- 方法接收者都是当前对象
从官方文档查到的资料:
调用方法的底层写法:
- 方法快速查找顺序:
- 从当前对象的类对象的cache中查找,
- 找到则返回方法实现
- 没找到则进入objc_msgSend_uncached
- 方法的慢速查找顺序:
- 1、再次从方法缓存查找
- 2、没找到则进入对象的类对象或元类里面的方法列表查找(for循环,二分查找法)
- 3、找到之后将方法缓存到cache_t里面,并返回
- 4、没找到则去当前类的父类的方法列表查找,找到后缓存并返回,
- 5、没找到则再往上找直到父类为nil,再没找到则进行消息转发即 imp = forwardImp