3

我已经阅读了 Apple 的消息转发文档和其他文章,似乎 ObjC 运行时会自动为对象转发无法识别的消息,如果没有匹配的选择器,它会抛出“无法识别的选择器发送到实例”错误。

但是我有两个问题我无法解释。

  • 运行时如何找到下一个消息转发对象?
  • 谁能解释一下 ObjC 消息转发链?
4

2 回答 2

4

并且似乎 ObjC 运行时会自动为对象转发无法识别的消息

你误会了。运行时找不到“下一个”对象,它调用同一个对象的forwardInvocation:方法。如果您希望一个对象将某些消息转发给某个其他对象(例如委托),您可以在您的类中实现该方法。

谁能解释一下 ObjC 消息转发链?

您可能会混淆消息转发和响应者链。两者没有关系。Cocoa 和 Cocoa Touch 都包含一个“响应者”类(NSResponderUIResponder分别),它从“第一响应者”开始创建对象“链”。响应者将他们未实现的消息传递给链中的下一个响应者。例如,Cocoa 中的菜单命令经常将它们的操作消息发送给第一响应者,这可能类似于文本字段或其他 UI 元素。如果该对象不处理该操作,则将其传递给下一个响应者,依此类推,直到消息由某个对象处理,或者到达链的末端(应用程序对象)。

于 2014-02-24T08:03:58.333 回答
0

考虑你有一个对象obj。在运行时,如果消息调用发生在obj上,您的 SDK 会调用

methodSignatureForSelector:

你的对象(因为任何继承自NSObject的类 methodSignatureForSelector:

适用于所有对象)。如果它返回NSMethodSignature 对象,那么您的 obj 已经实现了选择器,如果它为 nil,您的 SDK 将使您的应用程序崩溃。

于 2014-02-24T08:02:59.677 回答