3

Apple のメッセージ転送に関するドキュメントやその他の記事を読みましたが、ObjC ランタイムはオブジェクトの認識されないメッセージを自動的に転送し、一致するセレクターがない場合、「認識されないセレクターがインスタンスに送信されました」というエラーがスローされるようです。

しかし、私には説明できない 2 つの質問があります。

  • ランタイムは次のメッセージ転送オブジェクトをどのように見つけますか?
  • ObjC メッセージ転送チェーンについて説明できる人はいますか?
4

2 に答える 2

4

ObjC ランタイムは、認識されないオブジェクトのメッセージを自動的に転送するようです

あなたは誤解しました。ランタイムは「次の」オブジェクトを見つけられず、同じオブジェクトのforwardInvocation:メソッドを呼び出します。オブジェクトが特定のメッセージをデリゲートなどの他のオブジェクトに転送するようにする場合は、そのメソッドをクラスに実装できます。

ObjC メッセージ転送チェーンについて説明できる人はいますか?

メッセージ転送とレスポンダー チェーンを混同している可能性があります。二人は関係ありません。Cocoa と Cocoa Touch には両方とも、「最初のレスポンダー」から始まるオブジェクトの「チェーン」を作成する「レスポンダー」クラス (それぞれNSResponderと) が含まれています。UIResponderレスポンダーは、実装していないメッセージをチェーン内の次のレスポンダーに渡します。たとえば、Cocoa のメニュー コマンドは、多くの場合、テキスト フィールドやその他の UI 要素などのファーストレスポンダーにアクション メッセージを送信します。そのオブジェクトがアクションを処理しない場合は、次のレスポンダにそのアクションを渡します。メッセージが何らかのオブジェクトによって処理されるか、チェーンの最後 (アプリケーション オブジェクト) に到達するまで、同様の処理が繰り返されます。

于 2014-02-24T08:03:58.333 に答える
0

オブジェクトobjがあるとします。実行時にメッセージ呼び出しがobjに発生した場合、SDK は呼び出します

methodSignatureForSelector:

あなたのオブジェクトの(NSObjectから継承されたクラスのため methodSignatureForSelector:

すべてのオブジェクトで使用できます)。それがNSMethodSignature オブジェクトを返す場合、obj はセレクターを実装しています。それが nil の場合、SDK はアプリをクラッシュさせます。

于 2014-02-24T08:02:59.677 に答える