返回
iOS底层原理 -- 方法的慢速查找流程
IOS
2024-01-28 12:12:10
前言
在 iOS底层原理 -- RunTime之objc_msgSend探究(快速查找) 这篇文章中,我们已经分析了消息的快速查找流程,如果在快速查找流程中没有找到,就会进入到 __objc_msgSend_uncached 函数。
方法的慢速查找流程
方法的慢速查找流程主要包括以下几个步骤:
-
查找类方法
首先,查找类方法。如果当前类没有实现该方法,则继续查找父类,直到找到该方法或到达根类
NSObject
。 -
查找实例方法
如果在类方法查找中没有找到该方法,则继续查找实例方法。如果当前类没有实现该方法,则继续查找父类,直到找到该方法或到达根类
NSObject
。 -
动态方法解析
如果在实例方法查找中也没有找到该方法,则进行动态方法解析。动态方法解析会尝试在当前类或其父类中找到一个与该方法名称相同的方法,但参数类型不同的方法。如果找到这样的方法,则将其作为该方法的实现。
-
消息转发
如果在动态方法解析中也没有找到该方法,则进行消息转发。消息转发会将消息转发到另一个对象,由该对象来处理该消息。
数据结构和算法
方法的慢速查找流程使用以下数据结构和算法:
- 类方法缓存 :每个类都有一个类方法缓存,其中存储着该类及其父类中所有类方法的指针。
- 实例方法缓存 :每个类都有一个实例方法缓存,其中存储着该类及其父类中所有实例方法的指针。
- 动态方法解析表 :每个类都有一个动态方法解析表,其中存储着该类及其父类中所有动态方法解析方法的指针。
- 消息转发表 :每个类都有一个消息转发表,其中存储着该类及其父类中所有消息转发方法的指针。
方法的慢速查找流程使用以下算法:
- 类方法查找 :首先,在类方法缓存中查找该方法。如果找到,则直接返回该方法的指针。如果没有找到,则继续查找父类的类方法缓存,直到找到该方法或到达根类
NSObject
。 - 实例方法查找 :首先,在实例方法缓存中查找该方法。如果找到,则直接返回该方法的指针。如果没有找到,则继续查找父类的实例方法缓存,直到找到该方法或到达根类
NSObject
。 - 动态方法解析 :首先,在动态方法解析表中查找该方法。如果找到,则直接返回该方法的指针。如果没有找到,则继续查找父类的动态方法解析表,直到找到该方法或到达根类
NSObject
。 - 消息转发 :首先,在消息转发表中查找该方法。如果找到,则直接返回该方法的指针。如果没有找到,则继续查找父类的消息转发表,直到找到该方法或到达根类
NSObject
。
性能优化技术
为了优化方法的慢速查找流程的性能,可以采用以下技术:
- 使用类方法缓存和实例方法缓存 :类方法缓存和实例方法缓存可以减少方法查找的次数,从而提高方法查找的性能。
- 使用动态方法解析 :动态方法解析可以允许类在运行时添加或删除方法,从而提高方法查找的灵活性。
- 使用消息转发 :消息转发可以允许类将消息转发到另一个对象,从而提高方法查找的可扩展性。
结论
方法的慢速查找流程是消息发送过程中的一个重要步骤,它可以保证消息能够被正确地发送到相应的对象。通过使用类方法缓存、实例方法缓存、动态方法解析和消息转发等技术,可以优化方法的慢速查找流程的性能,从而提高应用程序的性能。