我已经阅读了 Apple 的消息转发文档和其他文章,似乎 ObjC 运行时会自动为对象转发无法识别的消息,如果没有匹配的选择器,它会抛出“无法识别的选择器发送到实例”错误。
但是我有两个问题我无法解释。
- 运行时如何找到下一个消息转发对象?
- 谁能解释一下 ObjC 消息转发链?
我已经阅读了 Apple 的消息转发文档和其他文章,似乎 ObjC 运行时会自动为对象转发无法识别的消息,如果没有匹配的选择器,它会抛出“无法识别的选择器发送到实例”错误。
但是我有两个问题我无法解释。
并且似乎 ObjC 运行时会自动为对象转发无法识别的消息
你误会了。运行时找不到“下一个”对象,它调用同一个对象的forwardInvocation:
方法。如果您希望一个对象将某些消息转发给某个其他对象(例如委托),您可以在您的类中实现该方法。
谁能解释一下 ObjC 消息转发链?
您可能会混淆消息转发和响应者链。两者没有关系。Cocoa 和 Cocoa Touch 都包含一个“响应者”类(NSResponder
和UIResponder
分别),它从“第一响应者”开始创建对象“链”。响应者将他们未实现的消息传递给链中的下一个响应者。例如,Cocoa 中的菜单命令经常将它们的操作消息发送给第一响应者,这可能类似于文本字段或其他 UI 元素。如果该对象不处理该操作,则将其传递给下一个响应者,依此类推,直到消息由某个对象处理,或者到达链的末端(应用程序对象)。
考虑你有一个对象obj。在运行时,如果消息调用发生在obj上,您的 SDK 会调用
methodSignatureForSelector:
你的对象(因为任何继承自NSObject的类 methodSignatureForSelector:
适用于所有对象)。如果它返回NSMethodSignature 对象,那么您的 obj 已经实现了选择器,如果它为 nil,您的 SDK 将使您的应用程序崩溃。