返回
iOS底层 — objc_msgSend(上)
IOS
2023-11-05 05:38:17
导言
在上一篇文章中,我们深入探讨了 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
被调用时,它会执行以下步骤:
- 检索对象的类信息:
objc_msgSend
会检索接收者的类信息,该信息存储在称为class
的结构中。 - 查找方法实现:
objc_msgSend
会在接收者的类中查找与选择器匹配的方法实现。 - 准备参数:
objc_msgSend
会准备要传递给方法的附加参数。 - 调用方法:
objc_msgSend
会调用找到的方法实现,并使用准备好的参数。 - 返回结果: 如果方法返回一个值,
objc_msgSend
会将其作为结果返回。
探索 insert 的调用
现在我们了解了 objc_msgSend
的工作原理,让我们探索 insert
函数的调用。
insert
函数的签名如下:
void insert(NSMutableArray *array, NSUInteger index, id anObject)
array
:要插入元素的NSMutableArray
。index
:要插入元素的位置。anObject
:要插入的元素。
当调用 insert
时,会发生以下步骤:
objc_msgSend
被调用,将NSMutableArray
对象作为接收者,@selector(insert:)
作为选择器,以及index
和anObject
作为附加参数。objc_msgSend
检索NSMutableArray
的类信息,并在其中查找-insertAtIndex:
方法的实现。objc_msgSend
准备要传递给方法的附加参数,包括index
和anObject
。objc_msgSend
调用-insertAtIndex:
方法,并使用准备好的参数。-insertAtIndex:
方法将anObject
插入到array
中指定的位置。
结语
通过研究 objc_msgSend
函数和 insert
函数的调用,我们加深了对 Objective-C Runtime 机制的理解。这些概念对于理解 Objective-C 程序的动态行为至关重要。在后续文章中,我们将继续深入探索 Runtime 的其他方面。