美文网首页
3.方法调用的过程

3.方法调用的过程

作者: 你weixiao的时候很美 | 来源:发表于2019-01-13 23:13 被阅读3次
1.objc_msgSend函数

在 Objective-C 中,消息是直到运行的时候才和方法实现绑定的。

我们调用方法的方式是 [reciver message], 会被编译器转化为转换成一个对消息函数objc_msgSend的调用。该函数有两个主要参数:消息接收者和消息对应的方法名字:

id objc_msgSend (receive, selector,... );

该消息函数做了动态绑定所需要的一切:

  • 它首先找到选标所对应的方法实现。因为不同的类对同一方法可能会有不同的实现,所以找到的 方法实现依赖于消息接收者的类型。
  • 然后将消息接收者对象(指向消息接收者对象的指针)以及方法中指定的参数传给找到的方法实 现。
  • 最后,将方法实现的返回值作为该函数的返回值返回。
1.消息发送(send):

通过isa指针找到类,在类的缓存中查找方法的imp,如果没找到,就去类的方法列表查找,还没找到,就去父类中查找。

2.动态方法解析(resolve):

如果一直找到nsobject,还是没有找到方法的imp。就会开始尝试:

 resolveMethod

此时,可以动态的给选择子添加方法的实现。

3. 消息转发(Message Forwarding):

如果resolve还是没有获得消息的imp。进入消息转发阶段。 首先会调用:

(id)forwardingTargetForSelector:(SEL)aSelector

把消息的接受者换成一个可以处理该消息的对象。此方法是指定备援接受者。但是消息的选择子和参数不变。

如果上一步还是不行,那么崩溃之前,系统会做一次完整的消息转发即:

(void)forwardInvocation:(NSInvocation *)anInvocation;

// Runtime系统会向对象发送methodSignatureForSelector:消息,并取到返回的方法签名用于生成NSInvocation对象。 但是我们如果用到这个方法,一般是不会简单的用原来的选择子和参数生成的anInvocation,而是自己做一个invocation,然后选择一个target。

相关文章

  • 3.方法调用的过程

    1.objc_msgSend函数 在 Objective-C 中,消息是直到运行的时候才和方法实现绑定的。 我们调...

  • iOS底层 -- Runtime之消息机制

    iOS方法调用的过程我们都很清楚,比如下面这个方法调用: [person test]; 这个方法调用过程是首先通过...

  • 2019-03-08

    方法 1.方法的执行过程中的内存分析 2.方法的重载机制 3.方法的递归调用 内存分析 方法区内存:代码片段——S...

  • iOS 方法调用的过程

    先看一道题: 程序执行的结果是什么?为什么呢?如果要解答这道题,就需要对OC的方法调用过程非常了解才能答对。先看看...

  • jvm调用方法的过程

    方法表https://blog.csdn.net/luanlouis/article/details/411136...

  • 微信小程序 Animation

    1.创建动画实例 2.调用实例的方法来实现动画的过程 3.实例的export()方法导出动画数据传递给组件

  • 调用函数 funtion 的方法

    1. 直接调用 2. 在对象方法里调用 3. 使用构造函数调用函数 4. 作为函数方法(call、apply)调用函数

  • 16、【Swift】可选(类型)链

    本质:安全解包 + 方法调用(属性读写、方法调用、脚标读写) 应用:检查(可选 属性、方法、下标)调用过程是否为 ...

  • 04-UI基础第4天

    一、xib文件的加载过程 默认调用init方法后,自动调用initWithFrame方法 xib的加载不会调用in...

  • Dalvik虚拟机异常处理

    方法调用栈 java虚拟机用方法调用栈来跟踪一系列的方法调用过程,该堆栈保存了每个调用方法的本地信息,比如方法的局...

网友评论

      本文标题:3.方法调用的过程

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