forwardInvocation如何调用?

时间:2013-03-02 19:21:42

标签: objective-c nsobject forwarding objective-c-runtime nsinvocation

仅查看Objective-C运行时库,当消息发送到不响应它的对象时,运行时系统会为接收者提供另一个处理消息的机会。因此,接收者的forward::方法(如果已实现)将被调用。但是,查看NSObject.mmNSObject似乎无法实现forward::

那么,如何调用NSObject的{​​{1}}方法,因为运行时系统在需要转发时唯一调用的是forwardInvocation:?基金会使用forward::runtime.h)设置一个新的处理程序,只要发送到objc_setForwardHandler对象的消息需要转发,就会调用forwardInvocation:吗?

2 个答案:

答案 0 :(得分:12)

在某些时候回来,在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,这是正确的。恐怕我不确定基金会什么时候打电话给我...我会猜测NSObject初始化。我也没有大量使用底层运行时实现,但希望至少某些帮助?

答案 1 :(得分:1)

SO post对您的问题有一个更详细的答案,即当邮件发送到不响应它的对象时会发生什么。