5

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

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

4

2 回答 2

12

在过去的某个时间点,Objective-C 运行NSObject中没有。当 Brad Cox 和 Tom Love 首次创建该语言时,他们添加了一个名为Object. 这已实现[Object forward::],用于进行消息转发。

几年后,NextStep 出现并为该语言添加了自己的内容,创建了 OpenStep 框架(后来成为 Cocoa)。NextStep 摆脱了Object该类,并将其替换为NSObject. 所做的更改之一是将forward::方法替换为forwardInvocation. 该Object课程仍在源代码中进行(如您所见),但我很确定它在 iOS 或 64 位 OS X 应用程序中均不可用。

您正确地建议 that objc_setForwardHandleris used 表示forwardInvocation应该使用而不是forward::for all NSObjects。恐怕我不确定基金会何时调用它......我猜想在NSObject初始化时。我也没有大量关注底层的运行时实现,但希望这至少会有所帮助?

于 2013-03-02T20:19:20.203 回答
1

这篇SO 帖子对您的问题有更详细的回答,即当消息发送到不响应的对象时会发生什么。

于 2013-04-09T14:52:22.277 回答