OC底层原理学习笔记(六)- OC的消息机制

OC中的方法调用其实都是转成了objc_msgSend函数的调用,给receiver(方法调用者)发送了一条消息
objc_msgSend底层有3大阶段:消息发送阶段、动态方法解析阶段、消息转发阶段


isa、superclass指针.jpg

1、消息发送阶段
首先会判断消息接收者是否为空,如果为空,直接返回,如果不为空
通过isa指针找到类对象,从类对象的cache中查找,找到直接调用,找不到就从方法列表class_rw_t里面查找,找到直接调用并缓存到cache中,找不到就通过superclass指针找到父类的类对象,从父类类对象的cache中查找,找到直接调用并缓存到receiverClass的cache中,找不到就从父类类对象的方法列表class_rw_t里面查找,找到直接调用并缓存到receiverClass的cache中,找不到就继续通过superclass指针往上找,直到基类都找不到的话就进入动态方法解析阶段

2、动态方法解析阶段
首先会判断是否已进行过动态方法解析
否:会调用resolveInstanceMethod:方法来动态解析方法,并且标记为已经动态解析
是:进入消息转发阶段

3、消息转发阶段
调用forwardingTargetForSelector:方法看返回值是否为nil
否:objc_msgSend(返回值,SEL)
是:调用methodSignatureForSelector:方法进行方法签名
看返回值是否为nil
否:调用forwardInvocation:方法
是:调用doesNotRecognizeSelector:方法
objc_msgSend如果找不到合适的方法进行调用,会报错 unrecognized selector sent to instance

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • OC - Runtime - Class 结构 和 OC 消息机制 Runtime 源码中 Class 结构如下:...
    xiaoyouPrince阅读 2,649评论 0 1
  • Runtime简称运行时,其中最主要的是消息机制 概述 C 与 OC 的不同 1.C 语言,函数的调用在编译的时候...
    苦可乐阅读 2,823评论 0 4
  • OC中的方法调用底层转成了objc_msgSend函数的调用,给receiver方法调用者发送一条@selecto...
    Jean_Lina阅读 2,656评论 0 0
  • 1.消息机制RunTime简称运行时。就是系统在运行的时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调...
    CoderSC阅读 3,138评论 0 1
  • 消息机制(Messaging) 不知大家有没有想过:我们在程序中调用的方法,是怎么执行的,又是怎么通过一个方法名字...
    百客阅读 5,160评论 0 8

友情链接更多精彩内容