IOS Runtime之方法查找流程的详细解析
2023-11-03 21:48:14
前言
上一篇文章中,我们探索了objc_msgSend消息发送的原理。在本文中,我们将重点研究方法查找流程,即当objc_msgSend试图调用某个方法时,系统是如何确定要调用的实际实现的。
方法查找概述
在IOS Runtime中,方法查找是一个复杂而关键的过程。它决定了当调用某个方法时,哪个实现将被执行。方法查找过程可以分为快速查找和慢速查找两种情况。
快速查找
快速查找是方法查找的默认方式。它适用于那些已经注册到类中的方法。当调用一个已经注册的方法时,系统会直接使用该方法的实现。
慢速查找
慢速查找用于查找那些没有注册到类中的方法。当调用一个没有注册的方法时,系统会执行以下步骤来查找该方法的实现:
- 检查该类是否实现了该方法。
- 如果没有,检查该类的父类是否实现了该方法。
- 依次检查该类的所有父类,直到找到实现了该方法的类。
- 如果没有找到,则抛出异常。
方法查找的具体过程
在IOS Runtime中,方法查找过程是由objc_msgSend方法实现的。objc_msgSend是一个汇编语言函数,它接受三个参数:
- receiver:要向其发送消息的对象。
- selector:要调用的方法的选择器。
- ...:要传递给该方法的参数。
objc_msgSend首先检查receiver是否实现了该方法。如果实现了,则直接使用该方法的实现。否则,objc_msgSend会执行慢速查找过程。
慢速查找过程首先检查receiver的父类是否实现了该方法。如果实现了,则直接使用该方法的实现。否则,objc_msgSend会依次检查receiver的所有父类,直到找到实现了该方法的类。
如果在receiver的所有父类中都没有找到该方法的实现,则objc_msgSend会抛出异常。
动态方法派发
动态方法派发是IOS Runtime的一项重要特性。它允许在运行时确定要调用的方法的实现。这使得我们可以实现许多强大的功能,例如消息转发和方法交换。
消息转发
消息转发是指将消息转发给另一个对象来处理。这通常用于处理那些没有在当前类中实现的方法。
方法交换
方法交换是指交换两个方法的实现。这通常用于调试或实现某些特殊的功能。
总结
方法查找是IOS Runtime中的一个关键过程。它决定了当调用某个方法时,哪个实现将被执行。方法查找过程可以分为快速查找和慢速查找两种情况。快速查找用于查找那些已经注册到类中的方法,而慢速查找用于查找那些没有注册到类中的方法。动态方法派发是IOS Runtime的一项重要特性,它允许在运行时确定要调用的方法的实现。消息转发和方法交换是动态方法派发的两个典型应用。