美文网首页
OC的消息机制

OC的消息机制

作者: hyq1101 | 来源:发表于2021-02-08 16:37 被阅读0次

    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

    相关文章

      网友评论

          本文标题:OC的消息机制

          本文链接:https://www.haomeiwen.com/subject/bnffxltx.html