Objective c 消息转发链

Objective c 消息转发链,objective-c,runtime,message-forwarding,Objective C,Runtime,Message Forwarding,我读过Apple和其他文章,ObjC运行时似乎会自动转发对象的未识别消息,如果没有匹配的选择器,它会抛出“未识别的选择器发送到实例”错误 但我有两个问题无法解释 运行时如何查找下一个消息转发对象 谁能解释一下ObjC消息转发链 假设您有一个对象obj。在运行时,如果消息调用发生在obj上,则SDK调用 methodSignatureForSelector: 对象的属性(因为任何类都继承自NSObjectmethodSignatureForSelector: 适用于所有对象)。如果它返回NSMe

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

但我有两个问题无法解释

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

    • 假设您有一个对象obj。在运行时,如果消息调用发生在obj上,则SDK调用

      methodSignatureForSelector:

      对象的属性(因为任何类都继承自NSObject
      methodSignatureForSelector:

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

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

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

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


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

      你说你已经阅读了苹果关于消息转发的文档。这里有解释。甚至在Wikipedia中也有解释运行时不必找到转发对象,对象必须通过
      forwardingTargetForSelector:
      提供它,或者您可以稍后通过
      fowardInvocation:
      转发它,这取决于每个类。我理解实现
      forwardInvocation
      方法的目的,但我想知道system framework对象是否也实现了这种方法?为什么我们可以使用类似于
      dismissViewController:animated:
      的方法来转发响应链?。UIViewController将
      -dismissViewController:animated:
      转发到演示控制器的原因是UIViewController定义了一个对象链,并且该方法足够智能,如果消息发送到演示视图控制器以外的视图控制器,则可以将消息传递到链中的下一个对象。谢谢,你的回答很有帮助。