Objective c 消息转发链
我读过Apple和其他文章,ObjC运行时似乎会自动转发对象的未识别消息,如果没有匹配的选择器,它会抛出“未识别的选择器发送到实例”错误 但我有两个问题无法解释Objective c 消息转发链,objective-c,runtime,message-forwarding,Objective C,Runtime,Message Forwarding,我读过Apple和其他文章,ObjC运行时似乎会自动转发对象的未识别消息,如果没有匹配的选择器,它会抛出“未识别的选择器发送到实例”错误 但我有两个问题无法解释 运行时如何查找下一个消息转发对象 谁能解释一下ObjC消息转发链 假设您有一个对象obj。在运行时,如果消息调用发生在obj上,则SDK调用 methodSignatureForSelector: 对象的属性(因为任何类都继承自NSObjectmethodSignatureForSelector: 适用于所有对象)。如果它返回NSMe
- 运行时如何查找下一个消息转发对象
- 谁能解释一下ObjC消息转发链
- 假设您有一个对象obj。在运行时,如果消息调用发生在obj上,则SDK调用
methodSignatureForSelector:
对象的属性(因为任何类都继承自NSObjectmethodSignatureForSelector:
适用于所有对象)。如果它返回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定义了一个对象链,并且该方法足够智能,如果消息发送到演示视图控制器以外的视图控制器,则可以将消息传递到链中的下一个对象。谢谢,你的回答很有帮助。