拜伦的博客

Coder Byron

这里有关于iOS,机器学习的笔记心得,欢迎交流


iOS底层(4)-方法调用机制

目录

消息发送objc_msgSend()

  • cache缓存中查找方法,找到了直接调用
  • class_rw_t方法列表中查找,找到了缓存到cache,再调用
  • superClass 缓存中查找,找到了缓存到cache,再调用
  • superClass class_rw_t方法列表中查找,找到了缓存到cache,再调用
  • 递归父类查找,直到父类为空,执行下一步动态方法解析

动态方法解析

  • 若未动态解析过,则调用 resolveInstanceMethod: resolveClassMethod: 来完成方法添加
  • 不管有没有实现,都会再次走上一步的方法查找
    • 若找到则执行并结束
    • 没找到则执行下一步消息转发

消息转发

  • 调用forwardingTargetForSelector:
    • 不为空则走objc_msgSend 向转发的对象发送消息调用
    • 返回值为nil,调用 methodSignatureForSelector
  • methodSignatureForSelector 返回为空 则crash
  • 不为空则调用 ForwardInvocation方法,在里面可以手动invoca和获取修改invoca的所有属性,包括target,methodSignature,selector

super 关键字

[self class] 与 [super class] 结果一样,因为super关键字底层实现是调用 objc_msgSendSuper({self, class_getSuperClass('selfClass')}, sel_registerName('class')), objc_msgSendSuper意义是从父类开始查找class方法,但是方法接收者还是self, 所以才能实现跳过自己,直接调用父类的方法。 class方法的实现是objc_getClass(self), 因为前面接收者是self,所以方法实现里的参数还是自己,那么打印出来就是一样的。

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦