返回

动态方法决议:iOS 底层的秘密

IOS

iOS 探索底层 —— 动态方法决议

前言

在我们之前的文章中,我们探讨了方法的快速查找和方法的慢速查找流程。那么,如果在调用 objc_msgSend 时,经过快速查找和慢速查找仍然找不到方法,系统接下来会如何处理呢?

动态方法决议

当快速查找和慢速查找都失败时,系统会进行动态方法决议。动态方法决议是一种在运行时查找方法的机制。它允许在编译时未知的方法在运行时被调用。

动态方法决议的过程

动态方法决议的过程涉及以下步骤:

  1. 消息转发(Message Forwarding): 当一个类没有实现被调用的方法时,它会将该消息转发给它的父类。这一过程将一直继续,直到找到一个实现了该方法的类,或者到达根类为止。
  2. 方法查找(Method Lookup): 如果消息转发失败,系统将使用 _objc_msgLookup() 函数在所有已注册的类中查找该方法。这包括所有已加载的框架和库。
  3. 消息发送(Message Sending): 如果方法查找成功,系统将使用 objc_msgSend() 函数将消息发送到找到的方法。

动态方法决 resolution 的优点

动态方法决议提供了以下优点:

  • 灵活性: 它允许在运行时添加和删除方法。
  • 扩展性: 它使类能够与其他类进行交互,即使这些类是在编译时未知的。
  • 解耦: 它将方法实现与类接口解耦,允许在不影响接口的情况下更改实现。

动态方法决 resolution 的缺点

动态方法决 resolution 也有一些缺点:

  • 性能开销: 它比静态方法调用慢,因为它需要在运行时进行额外的查找。
  • 不确定性: 它可能导致无法预测的方法调用,从而使调试和维护变得困难。
  • 潜在的错误: 如果方法查找失败,它可能会导致程序崩溃。

结论

动态方法决议是 iOS 中一项强大的机制,它允许在运行时调用未知的方法。它提供了灵活性、扩展性和解耦,但也有一些性能开销、不确定性和潜在错误的缺点。理解动态方法决议的过程对于编写健壮且可维护的 iOS 代码至关重要。

术语表

  • 快速查找(Fast Lookup): 一种在运行时查找方法的机制,通过使用缓存的类方法表来提高性能。
  • 慢速查找(Slow Lookup): 一种在运行时查找方法的机制,通过遍历类的父类链并检查每个类的类方法表来实现。
  • 消息转发(Message Forwarding): 一种机制,允许一个类将消息转发给它的父类。
  • 方法查找(Method Lookup): 一种在运行时在所有已注册的类中查找方法的机制。

参考