消息转发链

时间:2014-02-24 07:49:24

标签: objective-c runtime message-forwarding

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

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

  • 运行时如何找到下一个消息转发对象?
  • 任何人都可以解释一下ObjC消息转发链吗?

2 个答案:

答案 0 :(得分:4)

  

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

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

  

任何人都可以解释一下ObjC消息转发链吗?

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

答案 1 :(得分:0)

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

methodSignatureForSelector:

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

适用于所有对象)。如果它返回 NSMethodSignature对象,那么你的obj已经实现了选择器,如果它只是你的SDK会让你的应用程序崩溃。

相关问题