6、方法的查找解析

119 阅读1分钟

objc_class: 结构体cache存储了方法列表

方法是如何查找的呢?

从cache_t来读取方法 从这俩方法里读取

image.png

objc_msgSend的几种调用方式

image.png

objc_msgSend 与objc_msgSendSuper的区别是什么?

  • 查找方法的对象不一样,
  • 前者是实例对象的类对象
  • 后者是实例对象的父类的类对象
  • 方法接收者都是当前对象

从官方文档查到的资料:

image.png

调用方法的底层写法:

image.png

- 方法快速查找顺序:

  • 从当前对象的类对象的cache中查找,
  • 找到则返回方法实现
  • 没找到则进入objc_msgSend_uncached

- 方法的慢速查找顺序:

  • 1、再次从方法缓存查找
  • 2、没找到则进入对象的类对象或元类里面的方法列表查找(for循环,二分查找法)
  • 3、找到之后将方法缓存到cache_t里面,并返回
  • 4、没找到则去当前类的父类的方法列表查找,找到后缓存并返回,
  • 5、没找到则再往上找直到父类为nil,再没找到则进行消息转发即 imp = forwardImp