一个实例对象调用方法的调用过程

一个实例对象调用方法的调用过程

  1. 编译 -> 变成 objc_msgSend(id,SEL,...)
  2. 根据示例对象的 isa 指针,找到该对象的 Class
  3. 在 Class 中根据 SEL 方法名寻找函数实现 IMP

寻找过程

  1. 先在当前类的 cache 中查找
  2. 如果 cache 中没找到,就去当前类的 methodLists 列表中查找,最后根据 super class 找到父类
  3. 在父类的 methhodLists 中查找,直到找到 NSObject 为止,如果找到就根据找到的 IMP 去执行,
  4. 如果没找到就去执行消息转发流程

为什么先去找 cache

如果每次都去 methodLists 中去查找,效率会很低,所以所有调用过的方法都会以 map 的方式保存在 cache 中,提高查找效率。

你可能感兴趣的:(一个实例对象调用方法的调用过程)