返回

探索iOS中objc_msgSend消息动态解析和消息转发

IOS

iOS中objc_msgSend消息的动态解析和消息转发

前言

在上一篇文章中,我们了解了快速查找和慢速查找流程。那么当快速查找流程和慢速查找流程都结束了,仍然没有找到响应的方法时,会怎么办呢?苹果给出了两个建议,就是我们本次要研究的动态方法决议和消息转发。

动态方法决议

动态方法决议(Dynamic Method Resolution)是一种在运行时动态解析消息的方法。它允许在运行时查找和调用方法,而无需在编译时知道确切的方法名。这使得Objective-C能够实现强大的运行时特性,例如消息转发和反射。

动态方法决议的过程

动态方法决议的过程如下:

  1. 当编译器遇到一个消息调用时,它会生成一个调用objc_msgSend()的指令。
  2. objc_msgSend()函数会首先在当前对象及其父类中查找该方法。
  3. 如果在当前对象及其父类中找不到该方法,则会调用objc_msgSendSuper()函数。
  4. objc_msgSendSuper()函数会尝试在当前对象的超类中查找该方法。
  5. 如果在当前对象的超类中仍然找不到该方法,则会调用objc_msgSendRespondsToSelector()函数。
  6. objc_msgSendRespondsToSelector()函数会检查当前对象是否能够响应该消息。
  7. 如果当前对象能够响应该消息,则会调用objc_msgSendForward()函数。
  8. objc_msgSendForward()函数会将消息转发给另一个对象。

消息转发

消息转发(Message Forwarding)是一种将消息转发给另一个对象处理的机制。它允许一个对象将不属于自己的消息转发给另一个对象,从而实现代码的重用和解耦。

消息转发的过程

消息转发的过程如下:

  1. 当一个对象收到一条消息时,它会先检查自己是否能够处理这条消息。
  2. 如果对象能够处理这条消息,则会直接处理它。
  3. 如果对象无法处理这条消息,则会将消息转发给另一个对象。
  4. 这个对象可以是当前对象的父类、委托(delegate)或其他对象。
  5. 被转发的对象会尝试处理这条消息。
  6. 如果被转发的对象能够处理这条消息,则会直接处理它。
  7. 如果被转发的对象无法处理这条消息,则会继续将消息转发给另一个对象。
  8. 这个过程会一直持续下去,直到找到能够处理这条消息的对象,或者直到消息被转发给NSProxy对象。

结语

动态方法决议和消息转发是Objective-C中两个非常重要的特性。它们允许在运行时动态解析消息和转发消息,从而实现强大的运行时特性。理解这两个特性的原理对于深入理解iOS开发的内部运作机制非常重要。