仅查看Objective-C运行时库,当消息发送到不响应它的对象时,运行时系统会为接收者提供另一个处理消息的机会。因此,接收者的forward::
方法(如果已实现)将被调用。但是,查看NSObject.mm,NSObject
似乎无法实现forward::
。
那么,如何调用NSObject
的{{1}}方法,因为运行时系统在需要转发时唯一调用的是forwardInvocation:
?基金会使用forward::
(runtime.h)设置一个新的处理程序,只要发送到objc_setForwardHandler
对象的消息需要转发,就会调用forwardInvocation:
吗?
答案 0 :(得分:12)
在某些时候回来,在Objective-C运行时没有NSObject
。当语言最初由Brad Cox和Tom Love创建时,他们添加了一个名为Object
的根对象类。这实现了[Object forward::]
,用于进行消息转发。
几年后,NextStep出现并自己添加了该语言,创建了OpenStep框架(成为Cocoa)。 NextStep删除了Object
类,并将其替换为NSObject
。其中一项更改是将forward::
方法替换为forwardInvocation
。 Object
类仍然在源代码中发挥作用(正如您所发现的那样),但我非常确定它在iOS或64位OS X应用程序中都不可用。
建议objc_setForwardHandler
用于表示forwardInvocation
代替forward::
用于所有NSObjects
,这是正确的。恐怕我不确定基金会什么时候打电话给我...我会猜测NSObject
初始化。我也没有大量使用底层运行时实现,但希望至少某些帮助?
答案 1 :(得分:1)
此SO post对您的问题有一个更详细的答案,即当邮件发送到不响应它的对象时会发生什么。