返回
动态方法决议:iOS 底层的秘密
IOS
2023-09-18 17:19:56
iOS 探索底层 —— 动态方法决议
前言
在我们之前的文章中,我们探讨了方法的快速查找和方法的慢速查找流程。那么,如果在调用 objc_msgSend
时,经过快速查找和慢速查找仍然找不到方法,系统接下来会如何处理呢?
动态方法决议
当快速查找和慢速查找都失败时,系统会进行动态方法决议。动态方法决议是一种在运行时查找方法的机制。它允许在编译时未知的方法在运行时被调用。
动态方法决议的过程
动态方法决议的过程涉及以下步骤:
- 消息转发(Message Forwarding): 当一个类没有实现被调用的方法时,它会将该消息转发给它的父类。这一过程将一直继续,直到找到一个实现了该方法的类,或者到达根类为止。
- 方法查找(Method Lookup): 如果消息转发失败,系统将使用
_objc_msgLookup()
函数在所有已注册的类中查找该方法。这包括所有已加载的框架和库。 - 消息发送(Message Sending): 如果方法查找成功,系统将使用
objc_msgSend()
函数将消息发送到找到的方法。
动态方法决 resolution 的优点
动态方法决议提供了以下优点:
- 灵活性: 它允许在运行时添加和删除方法。
- 扩展性: 它使类能够与其他类进行交互,即使这些类是在编译时未知的。
- 解耦: 它将方法实现与类接口解耦,允许在不影响接口的情况下更改实现。
动态方法决 resolution 的缺点
动态方法决 resolution 也有一些缺点:
- 性能开销: 它比静态方法调用慢,因为它需要在运行时进行额外的查找。
- 不确定性: 它可能导致无法预测的方法调用,从而使调试和维护变得困难。
- 潜在的错误: 如果方法查找失败,它可能会导致程序崩溃。
结论
动态方法决议是 iOS 中一项强大的机制,它允许在运行时调用未知的方法。它提供了灵活性、扩展性和解耦,但也有一些性能开销、不确定性和潜在错误的缺点。理解动态方法决议的过程对于编写健壮且可维护的 iOS 代码至关重要。
术语表
- 快速查找(Fast Lookup): 一种在运行时查找方法的机制,通过使用缓存的类方法表来提高性能。
- 慢速查找(Slow Lookup): 一种在运行时查找方法的机制,通过遍历类的父类链并检查每个类的类方法表来实现。
- 消息转发(Message Forwarding): 一种机制,允许一个类将消息转发给它的父类。
- 方法查找(Method Lookup): 一种在运行时在所有已注册的类中查找方法的机制。