返回

深挖iOS13中方法查找流程之快速查找流程

IOS

前言

在iOS开发中,方法查找是一个非常重要的概念。方法查找的本质是消息发送。当我们调用一个方法时,系统会根据一系列规则来查找这个方法的实现。在iOS13中,方法查找流程有了一个新的优化,叫做快速查找流程。快速查找流程可以提高方法查找的速度,从而提高程序的性能。

快速查找流程

快速查找流程只适用于Objective-C类中的方法。在iOS13中,Objective-C类的方法查找流程分为两步:

  1. 查找缓存 :系统会先在方法查找缓存中查找这个方法。如果在方法查找缓存中找到了这个方法,那么系统会直接返回这个方法的实现。
  2. 查找实现 :如果在方法查找缓存中没有找到这个方法,那么系统会根据一系列规则来查找这个方法的实现。

方法查找缓存

方法查找缓存是一个存储了最近调用过的Objective-C类的方法的实现的缓存。方法查找缓存是一个全局的缓存,也就是说,所有线程都可以访问这个缓存。方法查找缓存的目的是为了提高方法查找的速度。当我们调用一个方法时,系统会先在方法查找缓存中查找这个方法。如果在方法查找缓存中找到了这个方法,那么系统会直接返回这个方法的实现。这样,就可以避免系统去根据一系列规则来查找这个方法的实现,从而提高方法查找的速度。

查找实现

如果在方法查找缓存中没有找到这个方法,那么系统会根据一系列规则来查找这个方法的实现。这些规则包括:

  1. 类方法 :如果这个方法是一个类方法,那么系统会先在当前类的类方法列表中查找这个方法。如果在当前类的类方法列表中找到了这个方法,那么系统会直接返回这个方法的实现。
  2. 实例方法 :如果这个方法是一个实例方法,那么系统会先在当前类的实例方法列表中查找这个方法。如果在当前类的实例方法列表中找到了这个方法,那么系统会直接返回这个方法的实现。
  3. 父类方法 :如果在当前类的类方法列表和实例方法列表中都没有找到这个方法,那么系统会继续在当前类的父类中查找这个方法。如果在当前类的父类中找到了这个方法,那么系统会直接返回这个方法的实现。
  4. 协议方法 :如果在当前类的类方法列表、实例方法列表和父类中都没有找到这个方法,那么系统会继续在当前类的协议中查找这个方法。如果在当前类的协议中找到了这个方法,那么系统会直接返回这个方法的实现。

如果在所有这些地方都没有找到这个方法,那么系统会抛出一个异常。

objc_msgSend和objc_msgSendSuper

objc_msgSend和objc_msgSendSuper是两个C函数,它们用于发送消息。objc_msgSend函数用于向一个对象发送消息,objc_msgSendSuper函数用于向一个对象的父类发送消息。这两个函数都是底层函数,它们在Objective-C运行时中发挥着重要的作用。

汇编快速查找

在iOS13中,方法查找流程的汇编快速查找是一个新的优化。汇编快速查找可以进一步提高方法查找的速度。汇编快速查找的工作原理是,系统会将Objective-C类中的方法的实现编译成汇编代码。然后,系统会将这些汇编代码存储在一个特殊的内存区域中。当我们调用一个方法时,系统会先在方法查找缓存中查找这个方法。如果在方法查找缓存中没有找到这个方法,那么系统会直接到这个特殊的内存区域中去查找这个方法的实现。这样,就可以避免系统去根据一系列规则来查找这个方法的实现,从而提高方法查找的速度。

总结

方法查找是iOS开发中一个非常重要的概念。在iOS13中,方法查找流程有了一个新的优化,叫做快速查找流程。快速查找流程可以提高方法查找的速度,从而提高程序的性能。快速查找流程只适用于Objective-C类中的方法。快速查找流程的工作原理是,系统会将Objective-C类中的方法的实现编译成汇编代码。然后,系统会将这些汇编代码存储在一个特殊的内存区域中。当我们调用一个方法时,系统会先在方法查找缓存中查找这个方法。如果在方法查找缓存中没有找到这个方法,那么系统会直接到这个特殊的内存区域中去查找这个方法的实现。这样,就可以避免系统去根据一系列规则来查找这个方法的实现,从而提高方法查找的速度。