iOS – Runtime-消息机制-objc_msgSend()

💡 原文中文,约9700字,阅读约需23分钟。
📝

内容提要

本文介绍了iOS中的音讯机制-objc_msgSend的履行流程,包括音讯发送、动态办法解析和音讯转发三个阶段。在动态办法解析阶段,开发者可以动态添加办法。在音讯转发阶段,可以自定义逻辑处理音讯。此外,还介绍了super的本质和使用方法。

🎯

关键要点

  • 本文介绍了iOS中的音讯机制-objc_msgSend的履行流程,分为音讯发送、动态办法解析和音讯转发三个阶段。

  • 音讯发送阶段通过class_rw_t查找办法,使用二分查找或遍历查找。

  • 动态办法解析阶段允许开发者动态添加办法,使用+resolveInstanceMethod:和+resolveClassMethod:。

  • 动态解析后会重新走音讯发送流程,查找办法。

  • 音讯转发阶段处理未被动态解析的音讯,通过forwardingTargetForSelector:、methodSignatureForSelector:和forwardInvocation:。

  • forwardingTargetForSelector:可以返回新的音讯接收者,methodSignatureForSelector:返回办法签名。

  • forwardInvocation:允许开发者自定义逻辑处理音讯。

  • super的本质是通过objc_msgSendSuper2函数调用,super_class表示从哪个类开始查找。

  • super和self的音讯接收者都是self,但super会多传一个super_class,影响查找顺序。

延伸问答

objc_msgSend的执行流程分为哪几个阶段?

objc_msgSend的执行流程分为音讯发送、动态办法解析和音讯转发三个阶段。

如何在动态方法解析阶段动态添加方法?

可以使用+resolveInstanceMethod:和+resolveClassMethod:方法来动态添加实例方法和类方法。

音讯转发阶段的处理流程是什么?

音讯转发阶段首先调用forwardingTargetForSelector:,如果未处理则调用methodSignatureForSelector:,最后调用forwardInvocation:。

super的本质是什么?

super的本质是通过objc_msgSendSuper2函数调用,super会多传一个super_class,影响查找顺序。

如何使用forwardInvocation:自定义逻辑处理消息?

在forwardInvocation:方法中,开发者可以自定义任何逻辑来处理未被解析的消息。

动态方法解析后会发生什么?

动态方法解析后会重新走音讯发送的流程,从receiverClass的cache中查找方法。

🏷️

标签

➡️

继续阅读