返回

iOS底层 — objc_msgSend(上)

IOS

导言

在上一篇文章中,我们深入探讨了 catch_t 的结构和插入流程。然而,insert 的调用方法仍然不甚明朗。在本文中,我们将深入研究 insert 的调用,并由此展开对 Runtime 概念的探索。

Runtime 入门

在研究 objc_msgSend 之前,我们有必要了解 Runtime 的概念。Runtime 是 Objective-C 语言的关键特性,它允许程序在运行时动态检查和修改对象的类型和行为。

Runtime 提供了一系列函数和数据结构,允许程序员:

  • 检索对象的类信息
  • 检查对象的属性和方法
  • 修改对象的属性值
  • 在运行时调用对象的方法

objc_msgSend 揭秘

objc_msgSend 是 Objective-C 中一个至关重要的函数,它负责将消息发送给对象。消息是一条请求,指定了要执行的特定方法。

objc_msgSend 函数的原型如下:

id objc_msgSend(id self, SEL op, ...)
  • self:消息接收者,即要执行方法的对象。
  • op:要执行的方法的选择器。
  • ...:可选的附加参数,这些参数将传递给方法。

objc_msgSend 被调用时,它会执行以下步骤:

  1. 检索对象的类信息: objc_msgSend 会检索接收者的类信息,该信息存储在称为 class 的结构中。
  2. 查找方法实现: objc_msgSend 会在接收者的类中查找与选择器匹配的方法实现。
  3. 准备参数: objc_msgSend 会准备要传递给方法的附加参数。
  4. 调用方法: objc_msgSend 会调用找到的方法实现,并使用准备好的参数。
  5. 返回结果: 如果方法返回一个值,objc_msgSend 会将其作为结果返回。

探索 insert 的调用

现在我们了解了 objc_msgSend 的工作原理,让我们探索 insert 函数的调用。

insert 函数的签名如下:

void insert(NSMutableArray *array, NSUInteger index, id anObject)
  • array:要插入元素的 NSMutableArray
  • index:要插入元素的位置。
  • anObject:要插入的元素。

当调用 insert 时,会发生以下步骤:

  1. objc_msgSend 被调用,将 NSMutableArray 对象作为接收者,@selector(insert:) 作为选择器,以及 indexanObject 作为附加参数。
  2. objc_msgSend 检索 NSMutableArray 的类信息,并在其中查找 -insertAtIndex: 方法的实现。
  3. objc_msgSend 准备要传递给方法的附加参数,包括 indexanObject
  4. objc_msgSend 调用 -insertAtIndex: 方法,并使用准备好的参数。
  5. -insertAtIndex: 方法将 anObject 插入到 array 中指定的位置。

结语

通过研究 objc_msgSend 函数和 insert 函数的调用,我们加深了对 Objective-C Runtime 机制的理解。这些概念对于理解 Objective-C 程序的动态行为至关重要。在后续文章中,我们将继续深入探索 Runtime 的其他方面。