問題タブ [message-forwarding]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - forwardInvocation: 戻り値が失われる
SZNUnmanagedReference クラスでメッセージ転送を使用したいと考えています。次のプロパティがあります。
基本的に、 UnmanagedReference のインスタンスがメッセージを受信すると、 という名前のメソッドを持つ にauthorsString
転送する必要があります。referenceDescriptor
- (NSString *)authorsStringWithSet:(NSSet *)authors
だから、私はこれを書いたSZNUnmanagedReference.m
:
SZNReferenceDescriptor
すべてが機能しているように見え、クラス内のコードが実行されます。authorsString
しかし、私は背中を取得する方法がわかりません。referenceDescriptor
ドキュメントを正しく理解していれば、メッセージの元の送信者に結果を送り返すことになっていると思います。しかし、うまくいかないようです。私のテストクラスでは、 を[unmanagedReference authorsString]
返しますnil
。
objective-c - -クラス メソッドの forwardInvocation
ファサード クラスを介してクラス メソッドを転送するのに苦労しています。
明確にするために、次のすべてのメソッドをオーバーライドしています。
.. それでも、クラス メソッドの場合、呼び出されるのは+resolveClassMethod
. そこから、YES を返すか NO を返すかに関係なく、すぐに認識されないセレクター例外が発生します。
どうしたの?
クラス メッセージ転送は、インスタンス メッセージ転送とは異なる動作をしますか? 同様に、クラス メソッド
がないのはなぜですか。+forwardInvocation
どんな助けでも大歓迎です。
objective-c - forwardingTargetForSelector: はどのように機能しますか?
私は持っていUIBarButtonItem
ます。処理できないメッセージを受信したときに、そのメッセージを特定のView Controllerに転送したい。
バー ボタン項目のメソッドを使用してこれを達成できるのではないかと考えforwardingTargetForSelector:
ましたが、タイプ のオブジェクトにはそのようなプロパティが見つからないようですUIBarButtonItem
。(用語のポイント: それforwardingTargetForSelector:
はプライベート プロパティという意味ですか? 編集: ちょっと待って、私は混乱していると思います... 最後にコロンが付いているメソッドはプロパティではありません... したがって、メソッドを公開することはできます (のように) getter/setter) どのパラメータが渡されますか?)
の値を設定するには、forwardingTargetForSelector:
設定したいオブジェクトの .m ファイル内から行う必要があるということですか? つまり、UIBarButtonItem をサブクラス化する必要があるということでしょうか?
もしそうなら、なぜこれが NSObjects のパブリック プロパティではないのでしょうか?
さらに、できればサブクラス化を回避して、転送の目標を達成するための最良の方法は何ですか?
追加情報:
これはすべて、同じボタンが押されたさまざまなインスタンスに対応して、1 つのアクションを再利用したいという私の傾向に起因しています。アクションは現在、デリゲートに含まれており (さまざまな VC で使用される [ほぼ] 同じアクションをどのように実装する必要がありますか? (回答: カテゴリを使用)を参照)、インスタンス化したビュー コントローラーに presentViewController メッセージを送信する必要があるという点だけが異なります。アクションを送信したボタン。したがって、アクションでは、presentViewController メッセージをsender
ボタンのインスタンスである に送信できます。そのメッセージを、ボタンのインスタンスを作成したビュー コントローラーに転送できるようにしたいと考えています。それぞれのView Controllerでインスタンス化された直後に、各ボタンの転送プロパティを設定します。
質問を短くするために「なぜ」を避けたかったのですが、それで終わりです。
objective-c - Objective-C メッセージングはどのように機能しますか? 「超」はどこ?メソッドのスウィズリングの前に、クラスがそのスーパーから実装されていることを確認するにはどうすればよいですか?
Obj-C メッセージについて質問があります。
(1)それが私の主な質問です:クラスをスウィズルまたは呼び出す前に、クラスにそのスーパークラスからの実装があることを確認するにはどうすればよいですか?
ターゲット クラスでは実装されていないが、そのスーパークラスでは実装されているメソッドでメソッド スウィズリングを実行したい場合、メソッド スウィズリングの前に、このクラスがそのスーパークラスから実装されていることを確認するにはどうすればよいですか?
オブジェクトを実装していないオブジェクトにメッセージが送信されると、Obj-C ランタイムはまずその継承階層を検索して、そのスーパークラスから実装を見つけます。存在する場合、Obj-C はそれを別のディスパッチ テーブルにキャッシュして呼び出します。
このキャッシュされた実装でメソッドの入れ替えを行うことはできますか? 可能であれば、メソッドのスウィズリングまたはこのオブジェクトへのメッセージの送信の前に、キャッシュされた実装があることを確認するにはどうすればよいですか? そうでない場合、メソッドの入れ替えの前に の実装を呼び出すだけの実際の実装をこのクラスに追加するにはどうすればよいですか?super
たとえば、次のようなクラス階層があります。
そして、このような実装:
-helloWorld
実行時に の実装をクラスと正確に交換 (追加ではなく) したいだけですD
。このトリックは、次のようなスウィズル メソッドの場合、元の実装に追加のタスクを追加します。
したがって、 Classまたは Class-helloWorld
のインスタンスにメッセージを送信すると、コンソールに次のメッセージが出力されます。D
E
いつか、クラスが次のようにD
実装し-helloWorld
た後:
Classまたは Class-helloWorld
のインスタンスにメッセージを送信すると、コンソールに次のメッセージが出力されます。D
E
D
このメソッド交換により、クラスが実装されているかどうかにかかわらず、追加のタスクが確実に呼び出されます-helloWorld
。
オブジェクトの の実装を呼び出す C 関数を作成する方法について質問super
しましたが、それを行うのは簡単ではないようです。super
Obj-C は、メッセージをの実装に転送するために、このキャッシュされたメカニズムをどのように実現しますか?
(2) Obj-C はどのようにsuper
キーワードを処理しますか? そしてどこsuper
ですか?
Obj-C メッセージでは、最初の 2 つの引数が隠されています:self
と_cmd
. これらは Obj-C 実装で使用できます。しかし、どこsuper
ですか?
a はのポインターsuper
と等しいか? Obj-C はどのようにキーワードを処理しますか?self
isa
super
すべての Obj-C メッセージはobjc_msgSend()
またはに変換されobjc_msgSend_stret()
ます。に送信されたすべてのメッセージは とsuper
に変換されobjc_msgSendSuper()
ますobjc_msgSendSuper_stret()
か?
前述の例では、-helloWorld
メッセージを ClassE
と ClassD
に送信E
して応答しない場合、Obj-C はメッセージを ClassC
の実装に送信します。ClassC
の実装では、その の実装を呼び出しますsuper
が、 ClassB
はそれを実装していないため、 Class に転送しA
ます。
この場合、 Class のsuper
は ClassC
である必要があるB
ため、実際には ClassB
のキャッシュされた実装を呼び出しますね。B
Classのキャッシュされた実装をスウィズルしてもいいですか?
c# - HttpRequestMessage を別のサーバーに転送する方法
http Web APIリクエストを別のサーバーに転送する最良の方法は何ですか?
これが私が試していることです:
特定の API 要求を取得したときに、要求を変更し、それを別のサーバーに転送して、その 2 番目のサーバーから送信された応答を返したい .NET プロジェクトがあります。
私は次のことをしています:
Clone メソッドは次のように定義されています。
ただし、何らかの理由で、URL を指定された redirectUri にリダイレクトする代わりに、RequestMessage.RequestUri が に設定されている 404 応答が返されhttp://localhost:61833/api/products/2
ます。(http://localhost:61833
元のリクエスト uri のルートです)。
ありがとう
objective-c - メッセージ転送チェーン
Apple のメッセージ転送に関するドキュメントやその他の記事を読みましたが、ObjC ランタイムはオブジェクトの認識されないメッセージを自動的に転送し、一致するセレクターがない場合、「認識されないセレクターがインスタンスに送信されました」というエラーがスローされるようです。
しかし、私には説明できない 2 つの質問があります。
- ランタイムは次のメッセージ転送オブジェクトをどのように見つけますか?
- ObjC メッセージ転送チェーンについて説明できる人はいますか?