Apple のメッセージ転送に関するドキュメントやその他の記事を読みましたが、ObjC ランタイムはオブジェクトの認識されないメッセージを自動的に転送し、一致するセレクターがない場合、「認識されないセレクターがインスタンスに送信されました」というエラーがスローされるようです。
しかし、私には説明できない 2 つの質問があります。
- ランタイムは次のメッセージ転送オブジェクトをどのように見つけますか?
- ObjC メッセージ転送チェーンについて説明できる人はいますか?
Apple のメッセージ転送に関するドキュメントやその他の記事を読みましたが、ObjC ランタイムはオブジェクトの認識されないメッセージを自動的に転送し、一致するセレクターがない場合、「認識されないセレクターがインスタンスに送信されました」というエラーがスローされるようです。
しかし、私には説明できない 2 つの質問があります。
ObjC ランタイムは、認識されないオブジェクトのメッセージを自動的に転送するようです
あなたは誤解しました。ランタイムは「次の」オブジェクトを見つけられず、同じオブジェクトのforwardInvocation:
メソッドを呼び出します。オブジェクトが特定のメッセージをデリゲートなどの他のオブジェクトに転送するようにする場合は、そのメソッドをクラスに実装できます。
ObjC メッセージ転送チェーンについて説明できる人はいますか?
メッセージ転送とレスポンダー チェーンを混同している可能性があります。二人は関係ありません。Cocoa と Cocoa Touch には両方とも、「最初のレスポンダー」から始まるオブジェクトの「チェーン」を作成する「レスポンダー」クラス (それぞれNSResponder
と) が含まれています。UIResponder
レスポンダーは、実装していないメッセージをチェーン内の次のレスポンダーに渡します。たとえば、Cocoa のメニュー コマンドは、多くの場合、テキスト フィールドやその他の UI 要素などのファーストレスポンダーにアクション メッセージを送信します。そのオブジェクトがアクションを処理しない場合は、次のレスポンダにそのアクションを渡します。メッセージが何らかのオブジェクトによって処理されるか、チェーンの最後 (アプリケーション オブジェクト) に到達するまで、同様の処理が繰り返されます。
オブジェクトobjがあるとします。実行時にメッセージ呼び出しがobjに発生した場合、SDK は呼び出します
methodSignatureForSelector:
あなたのオブジェクトの(NSObjectから継承されたクラスのため methodSignatureForSelector:
すべてのオブジェクトで使用できます)。それがNSMethodSignature オブジェクトを返す場合、obj はセレクターを実装しています。それが nil の場合、SDK はアプリをクラッシュさせます。