返回

IOS Runtime之方法查找流程的详细解析

IOS

前言

上一篇文章中,我们探索了objc_msgSend消息发送的原理。在本文中,我们将重点研究方法查找流程,即当objc_msgSend试图调用某个方法时,系统是如何确定要调用的实际实现的。

方法查找概述

在IOS Runtime中,方法查找是一个复杂而关键的过程。它决定了当调用某个方法时,哪个实现将被执行。方法查找过程可以分为快速查找和慢速查找两种情况。

快速查找

快速查找是方法查找的默认方式。它适用于那些已经注册到类中的方法。当调用一个已经注册的方法时,系统会直接使用该方法的实现。

慢速查找

慢速查找用于查找那些没有注册到类中的方法。当调用一个没有注册的方法时,系统会执行以下步骤来查找该方法的实现:

  1. 检查该类是否实现了该方法。
  2. 如果没有,检查该类的父类是否实现了该方法。
  3. 依次检查该类的所有父类,直到找到实现了该方法的类。
  4. 如果没有找到,则抛出异常。

方法查找的具体过程

在IOS Runtime中,方法查找过程是由objc_msgSend方法实现的。objc_msgSend是一个汇编语言函数,它接受三个参数:

  1. receiver:要向其发送消息的对象。
  2. selector:要调用的方法的选择器。
  3. ...:要传递给该方法的参数。

objc_msgSend首先检查receiver是否实现了该方法。如果实现了,则直接使用该方法的实现。否则,objc_msgSend会执行慢速查找过程。

慢速查找过程首先检查receiver的父类是否实现了该方法。如果实现了,则直接使用该方法的实现。否则,objc_msgSend会依次检查receiver的所有父类,直到找到实现了该方法的类。

如果在receiver的所有父类中都没有找到该方法的实现,则objc_msgSend会抛出异常。

动态方法派发

动态方法派发是IOS Runtime的一项重要特性。它允许在运行时确定要调用的方法的实现。这使得我们可以实现许多强大的功能,例如消息转发和方法交换。

消息转发

消息转发是指将消息转发给另一个对象来处理。这通常用于处理那些没有在当前类中实现的方法。

方法交换

方法交换是指交换两个方法的实现。这通常用于调试或实现某些特殊的功能。

总结

方法查找是IOS Runtime中的一个关键过程。它决定了当调用某个方法时,哪个实现将被执行。方法查找过程可以分为快速查找和慢速查找两种情况。快速查找用于查找那些已经注册到类中的方法,而慢速查找用于查找那些没有注册到类中的方法。动态方法派发是IOS Runtime的一项重要特性,它允许在运行时确定要调用的方法的实现。消息转发和方法交换是动态方法派发的两个典型应用。