美文网首页
IOS基础知识-Runtime方法调用原理篇

IOS基础知识-Runtime方法调用原理篇

作者: 程序员的自我救赎 | 来源:发表于2019-06-25 18:50 被阅读0次

方法调用可以大致分为三个阶段:

消息发送阶段:从缓存中查找方法,如果找到即调用,没找到则进入动态解析阶段
动态解析阶段:负责动态添加方法实现,如果没有实现,则进入消息转发阶段
消息转发阶段:将消息转发给可以处理消息的对象

如果消息转发也没实现,就会包方法找不到错误:unrecognzied selector sent to instance

消息发送

1434508-b564f04069f7f53e.png

动态解析

当本类包括父类cache包括class_rw_t中都找不到方法时,就会进入动态方法解析阶段;
动态解析对象方法时,会调用+(BOOL)resolveInstanceMethod:(SEL)sel方法。
动态解析类方法时,会调用+(BOOL)resolveClassMethod:(SEL)sel方法。


1434508-4a0b8a020a3307f7.png

消息转发

当本类没有实现方法,并且没有动态解析方法,就会调用forwardingTargetForSelector函数,进行消息转发,我们可以实现forwardingTargetForSelector函数,在其内部将消息转发给可以实现此方法的对象。
如果forwardingTargetForSelector函数返回为nil或者没有实现的话,就会调用methodSignatureForSelector方法,用来返回一个方法签名,这也是我们正确跳转方法的最后机会。
如果methodSignatureForSelector方法返回正确的方法签名就会调用forwardInvocation方法,forwardInvocation方法内提供一个NSInvocation类型的参数,NSInvocation封装了一个方法的调用,包括方法的调用者,方法名,以及方法的参数。在forwardInvocation函数内修改方法调用对象即可。
如果methodSignatureForSelector返回的为nil,就会来到doseNotRecognizeSelector:方法内部,程序crash提示无法识别选择器unrecognized selector sent to instance。


1434508-b3b8e9e574be80fa.png

相关文章

  • IOS基础知识-Runtime方法调用原理篇

    方法调用可以大致分为三个阶段: 如果消息转发也没实现,就会包方法找不到错误:unrecognzied select...

  • iOS底层原理——runtime

    runtime runtime 是iOS的运行时,用于实现iOS加载和调用属性和方法。 函数中load方法没有使用...

  • Runtime要点

    Runtime原理 Runtime是iOS核心运行机制之一,iOS App加载库、加载类、执行方法调用,全靠Run...

  • iOS基础知识 (一)

    一、Runtime原理 Runtime是iOS核心运行机制之一,iOS App加载库、加载类、执行方法调用,全靠R...

  • iOS消息发送的调用过程

    iOS方法的调用过程 [object methodA]runtime层会将这个方法翻译成objc_msgSend(...

  • iOS源码解析:runtime<二> objc_ms

    iOS源码解析:runtime<一> isa,class底层结构窥探iOS方法调用的过程我们都很清楚,比如下面这个...

  • iOS-Runtime-实践篇

    前言 首先, 如果不太了解Runtime的原理的, 可以去我的上一篇文章里先了解了解iOS-Runtime-原理篇...

  • [iOS]libffi动态调用C函数

    前言:在iOS开发中可以使用Runtime动态调用OC方法,但是无法动态调用C函数,那么该如何动态调用C函数呢?值...

  • #iOS进阶之Runtime----方法---objc_msgS

    iOS进阶之Runtime----方法---objc_msgSend执行流程 OC中的方法调用,其实都是转换成ob...

  • OC -> Runtime

    Runtime简介 Runtime用处 Runtime实践 Runtime 类方法调用实现。Person * p ...

网友评论

      本文标题:IOS基础知识-Runtime方法调用原理篇

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