返回

消息发送机制:OC底层的快速通道

IOS

揭秘消息发送机制:OC 的快速通道

我们熟知的 OC 函数调用实际上是消息发送机制在发挥作用。消息发送机制是如何实现的呢?它又是如何做到如此之快的?在这篇文章中,我们将深入探索消息发送机制的内部工作原理,了解 OC 底层如何实现快速查找。

消息发送的两种路径:快速通道与慢速通道

消息发送机制主要包含两种路径:快速路径和慢速路径。快速路径是通过汇编从响应的缓存中查找,而慢速路径则是通过 C、C++ 和汇编一起完成的。

快速路径

当我们调用一个对象的方法时,编译器会根据方法名生成一个 SEL(Selector),它是一个指向方法实现的指针。然后,Objective-C 运行时会使用这个 SEL 去缓存中查找对应的实现。如果缓存中存在,则直接执行该实现;如果缓存中不存在,则走慢速路径。

慢速路径

如果走慢速路径,运行时会先在类结构中的 cache_t 缓存中查找方法实现。cache_t 缓存是一个哈希表,它将 SEL 作为键,方法实现作为值。如果在 cache_t 缓存中找到了方法实现,则直接执行该实现;如果在 cache_t 缓存中没有找到方法实现,则继续走慢速路径。

慢速路径的下一阶段是检查类的超类是否实现了该方法。如果超类实现了该方法,则直接执行该方法;如果超类没有实现该方法,则继续走慢速路径。

慢速路径的最后一阶段是通过字典查找来查找方法实现。字典查找是一种非常慢的操作,因此尽量避免走慢速路径。

幕后的复杂机制:缓存、字典查找与哈希表

消息发送机制之所以能够如此之快,很大程度上归功于缓存、字典查找和哈希表的使用。

缓存

缓存是一种临时存储器,它可以存储最近使用的数据,以便下次需要时可以快速访问。在消息发送机制中,缓存用于存储最近调用的方法实现。当我们再次调用相同的方法时,运行时会直接从缓存中获取方法实现,从而避免了慢速路径的查找过程。

字典查找

字典查找是一种数据结构,它允许我们根据键快速查找值。在消息发送机制中,字典查找用于查找类的超类是否实现了某个方法。当我们调用一个方法时,运行时会先在类的 cache_t 缓存中查找方法实现。如果在 cache_t 缓存中没有找到方法实现,则会继续走慢速路径。慢速路径的下一阶段就是通过字典查找来查找方法实现。

哈希表

哈希表是一种数据结构,它允许我们根据键快速查找值。在消息发送机制中,哈希表用于存储类的 cache_t 缓存。当我们调用一个方法时,运行时会先在类的 cache_t 缓存中查找方法实现。如果在 cache_t 缓存中找到了方法实现,则直接执行该实现;如果在 cache_t 缓存中没有找到方法实现,则继续走慢速路径。

结语

消息发送机制是 OC 底层的一项重要机制,它也是 OC 能够实现如此之快的原因之一。通过了解消息发送机制的内部工作原理,我们不仅能够更好地理解 OC 的运行机制,还能为我们优化代码提供指导。