5

Objective-C ランタイム ライブラリだけを見ると、応答しないオブジェクトにメッセージが送信された場合、ランタイム システムは受信者にメッセージを処理する別の機会を与えます。したがって、レシーバーのforward::メソッドが実装されている場合は、呼び出されます。ただし、NSObject.mmを見ると、NSObject実装されていないようですforward::

では、転送が必要なときにランタイム システムが呼び出すのは だけなので、NSObjectのメソッドはどのように呼び出されるのでしょうか。Foundation は( runtime.h ) を使用して、オブジェクトに送信されたメッセージを転送する必要があるたびに呼び出す新しいハンドラーを設定しますか?forwardInvocation:forward::objc_setForwardHandlerforwardInvocation:NSObject

4

2 に答える 2

12

昔のある時点NSObject、Objective-C ランタイムにはありませんでした。この言語が Brad Cox と Tom Love によって最初に作成されたとき、彼らは と呼ばれるルート オブジェクト クラスに追加しましたObject[Object forward::]これは、メッセージ転送を行うために使用された を実装しました。

数年後、NextStep が登場し、言語に独自の追加を行い、OpenStep フレームワーク (Cocoa になりました) を作成しました。NextStep はObjectクラスを取り除き、 に置き換えましたNSObject。行われた変更の 1 つは、forward::メソッドをに置き換えることでしたforwardInvocation。このObjectクラスはまだソース コードで動き回っていますが (ご覧のとおり)、iOS アプリでも 64 ビット OS X アプリでも利用できないと確信しています。

for allの代わりに that を使用する必要があることobjc_setForwardHandlerを示すために、that が使用されていることを示唆するのは正しいことです。ファウンデーションがいつこれを呼び出すかはわかりません...初期化時に推測します。また、基礎となるランタイムの実装についても大したことはありませんが、それが少なくとも何らかの助けになることを願っていますか?forwardInvocationforward::NSObjectsNSObject

于 2013-03-02T20:19:20.203 に答える