返回

iOS 底层原理 — Runtime 之 objc_msgSend 探究(快速查找)

IOS

前言

在 iOS 底层原理 — objc_class 中的 cache 探究一文中,我们探索 cache_t 时发现,在调用实例方法之前,对象实际上会调用 objc_msgSend 方法。如果对此感兴趣,不妨一探究竟。

objc_msgSend 初探

objc_msgSend 是 Objective-C 中一个至关重要的函数,负责消息传递。它允许对象向其他对象发送消息,请求执行特定任务或获取信息。消息传递是 Objective-C 的核心机制之一,使我们能够以一种非常动态的方式编写代码,并且便于代码重用和维护。

objc_msgSend 函数的语法如下:

id objc_msgSend(id self, SEL op, ...);

其中:

  • self:发送消息的对象。
  • op:要发送的消息。
  • ...:可选的参数列表,具体取决于所发送的消息。

当我们调用一个实例方法时,实际上是在调用 objc_msgSend 函数。例如,以下代码向 person 对象发送 getName 消息:

NSString *name = [person getName];

这相当于调用以下代码:

id name = objc_msgSend(person, @selector(getName));

objc_msgSend 函数是如何工作的呢?它首先查找要发送的消息所对应的实现。这可以通过两种方式来完成:

  1. 直接查找:如果要发送的消息在接收对象所属的类中已实现,那么该实现将被直接调用。
  2. 间接查找:如果要发送的消息在接收对象所属的类中未实现,那么该函数将沿着继承链向上查找,直到找到该消息的实现或到达根类 NSObject

一旦找到要发送的消息的实现,objc_msgSend 函数就会调用该实现,并将参数传递给该实现。实现函数执行后,objc_msgSend 函数就会返回实现函数的返回值。

objc_msgSend 的优化

objc_msgSend 函数是一个非常重要的函数,因此对其进行优化非常重要。Apple 在 iOS 中引入了许多优化技术来提高 objc_msgSend 函数的性能。这些优化技术包括:

  • 内联: 对于那些经常被调用的消息,objc_msgSend 函数会将这些消息的实现内联到调用者的代码中。这可以避免函数调用的开销,从而提高性能。
  • 消息缓存: objc_msgSend 函数会将最近发送的消息缓存在一个查找表中。当再次发送这些消息时,objc_msgSend 函数可以从缓存中快速找到消息的实现,从而提高性能。
  • 消息转发: 有时,我们可能需要将消息转发到其他对象来处理。objc_msgSend 函数提供了消息转发机制,允许我们将消息转发到其他对象。这可以提高代码的灵活性,并使我们能够编写更模块化的代码。

总结

objc_msgSend 函数是 Objective-C 中一个非常重要的函数,负责消息传递。它允许对象向其他对象发送消息,请求执行特定任务或获取信息。消息传递是 Objective-C 的核心机制之一,使我们能够以一种非常动态的方式编写代码,并且便于代码重用和维护。

objc_msgSend 函数是如何工作的呢?它首先查找要发送的消息所对应的实现。这可以通过两种方式来完成:直接查找和间接查找。一旦找到要发送的消息的实现,objc_msgSend 函数就会调用该实现,并将参数传递给该实现。实现函数执行后,objc_msgSend 函数就会返回实现函数的返回值。

objc_msgSend 函数是一个非常重要的函数,因此对其进行优化非常重要。Apple 在 iOS 中引入了许多优化技术来提高 objc_msgSend 函数的性能。这些优化技术包括内联、消息缓存和消息转发。