仅查看Objective-C运行时库,当消息发送到不响应的对象时,运行时系统为接收者提供了处理消息的另一次机会。因此,如果实现了接收者的forward::方法,则该方法将被调用。但是,从NSObject.mm来看,NSObject似乎没有实现forward::

那么,如何调用NSObjectforwardInvocation:方法,因为运行系统在需要转发时唯一需要调用的就是forward::? Foundation是否使用objc_setForwardHandler(runtime.h)设置一个新的处理程序,该处理程序在需要转发发送到forwardInvocation:对象的消息时调用NSObject

最佳答案

在过去的某个时候,Objective-C运行时中没有NSObject。当布拉德·考克斯(Brad Cox)和汤姆·洛夫(Tom Love)首次创建该语言时,他们添加了一个名为Object的根对象类。这实现了[Object forward::],用于执行消息转发。

几年后,NextStep出现并对其语言进行了补充,从而创建了OpenStep框架(已成为Cocoa)。 NextStep摆脱了Object类,并将其替换为NSObject。所做的更改之一是将forward::方法替换为forwardInvocationObject类仍在源代码中运行(如您所见),但是我很确定它在iOS或64位OS X应用程序中均不可用。

您正确建议使用objc_setForwardHandler来指示应为所有forwardInvocation使用forward::而不是NSObjects。恐怕我不确定Foundation何时调用此方法...我会猜测NSObject的初始化。我也不太关注底层的运行时实现,但是希望至少会有帮助吗?

关于objective-c - forwardInvocation : get called?如何,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15178395/

10-11 22:15