美文网首页
OC中消息传递和消息转发

OC中消息传递和消息转发

作者: 深度码农患者 | 来源:发表于2020-05-02 21:45 被阅读0次

Objective-C是一门面向运行时的语言,它尽可能的把一些编译和链接时需要执行的逻辑延迟到运行时,使Runtime可以按需要把消息重定向到合适的对象,以实现动态添加属性和动态方法交换等等。
Objective-C在编译阶段并不会去绑定执行的函数,只有在运行的时候才会到类和对象的方法列表中查找对应的方法。

OC中的方法查找

OC在进行消息传递的时候,会先到缓存中以哈希查找的方式去查找缓存,若缓存命中,则执行对应方法。若未命中,则从当前类的方法列表中取查找。
从当前类的方法列表中查找(对于已完成排序的列表,采用二分查找法去查找对应的方法实现。对于没有完成排序的算法,采用一般遍历查找法去查找对应方法的实现),若在当前类方法列表中命中,则执行,否则再到父类方法列表中去查找,以重复这一过程。

OC中的消息传递

Objective-C中的消息发送是通过objc_msgSend(id, SEL,...)来实现的。Objective-C中的消息传递就是一次方法查找的过程。Objective-C调用一个方法,先去当前类中查找该方法的imp,如果查找不到,则到父类中能够去查找...以此类推,如果到根类中没有查找到该方法,则此次方法传递结束。

OC中的消息转发

Objective-C中消息转发过程如下所示:


  1. 先调用resolveInstanceMethod,如果在这里使用runtime动态添加对应的方法,并且返回YES,消息就找到了响应的对象,并将这个新增的方法添加到类的方法缓存列表
  2. 如果上面的方法返回NO的话,对象会调用forwardingTargetForSelector方法,以实现消息的转发,让其他对象来处理这个消息。
  3. 如果以上两个方法都没有做处理,那么对象会执行最后一个方法methodSignatureForSelector,提供一个有效的方法签名。若提供了有效的方法签名,程序会通过forwardInvocation方法执行签名。若没有提供方法签名,触发doesNotRecognizeSelector方法,触发崩溃。

resolveInstanceMethod

resolveInstanceMethod是Objective-C语言中一种动态方法解析的接口,是得我们可以在运行时动态的为一个selector提供实现。我们只需要实现 +resolveInstanceMethod和+resolveClassMethod方法,并在其中为指定的selector提供实现即可(通过调用运行时函数class_addMethod来添加)。这两个方法都是NSObject中的类方法,其原型为:

+ (BOOL)resolveClassMethod:(SEL)name;
+ (BOOL)resolveInstanceMethod:(SEL)name;

参数那么是需要被动态解析的selector;如果在该函数中为指定的selector提供实现,无论返回YES还是NO,编译运行都是正确的。如果在该函数内并没有真正的为selector提供实现,如果返回YES,运行会crash。其原理很简单,因为当前类既没有为selector提供实现,又没有实现消息转发,自然会crash。

forwardingTargetForSelector

forwardingTargetForSelector是Objective-C语言中消息快速重定向的函数。开发者可以在派生类中对其进行重载,从而将无法处理的selector转发给另一个对象。

methodSignatureForSelector

methodSigntureForSelector的作用在在于为另一个类实现的消息创建一个有效的方法签名。如果没有实现有效的方法签名,程序就会崩溃

forwardInvocation

在返回有效的方法签名的情况下,当前对象则会调用forwardInvocation方法,以完成消息的最终传递。

相关文章

  • OC中消息传递和消息转发

    Objective-C是一门面向运行时的语言,它尽可能的把一些编译和链接时需要执行的逻辑延迟到运行时,使Runti...

  • 消息传递和消息转发

    当调用一个方法 run 之后 oc方法会转变为objc_msgSend(id theReceiver, SEL s...

  • OC的消息传递机制和消息转发机制

    绪:静态绑定:编译时期便能确定所要调用的函数。动态绑定:运行时期才能确定所要调用的函数。 一. 消息传递机制。 1...

  • objc_msgSend

    OC中消息的概念 OC中在对象上调用方法,用OC的术语叫“传递消息”。在OC中,如果向某对象传递消息,会使用动态绑...

  • (4)OC中消息和消息转发-02

    上篇文章讲到,如果通过_class_resolveInstanceMethod和- (id)forwardingT...

  • (3)OC中消息和消息转发-01

    前一段时间有朋友问了下面的这个问题,我给出的回答是这样的: 其实上面回答的方法调用也都是基于以前对runtime的...

  • runtime -消息传递和消息转发

    1.问题来源: 当我们对一个对象或者类调用对应的方法后,系统底层是如何实现的呢? 2.验证问题,探究 开发中遇以下...

  • OC中消息传递的过程及消息转发流程

    会先从缓存中查找,采用的是哈希查找,若缓存命中,执行对应函数,若未命中,则从当前类方法列表中查找; 从当前类方法列...

  • OC消息传递机制与消息转发机制

    oc运行机制是动态的,运行时所执行的代码是由运行环境来决定的,静态的机制是由编译器来决定的,(编译期是指把你的源程...

  • OC runtime_1(消息传递,消息转发)

    运行时(runtime)系统是一个提供一系列公开函数接口以及数据结构的动态链接库 消息传递机制: OC是动态语言,...

网友评论

      本文标题:OC中消息传递和消息转发

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