私はいつもフォーラムをチェックしていますが、最初に私がstackoverflowに投稿したものです。誰がメッセージを送ったのかを知る方法
私はObjCでメソッドの引数としてポインタを送信せずにメッセージを送信した人を知るための便利な方法を探しています。
誰でも手助けできますか?
ありがとうございます!
私はいつもフォーラムをチェックしていますが、最初に私がstackoverflowに投稿したものです。誰がメッセージを送ったのかを知る方法
私はObjCでメソッドの引数としてポインタを送信せずにメッセージを送信した人を知るための便利な方法を探しています。
誰でも手助けできますか?
ありがとうございます!
一般的なケースでは実行できません(ランタイムやメイン機能などの自己が存在しない場所からメッセージを設定できます)。技術的に可能な場合でも、実際的ではありません。スタックを歩いてそこのバイトを分析する必要があります。
実際には、アクションメソッド以外のほとんどの場合、送信者を知る必要はありません。それは通常、悪いデザインの兆候です。そして、どんな場合でも、別のオブジェクトへの参照を取得する必要があるときは、それをメソッドの引数として渡す必要があります。
編集:私はちょうどこれにつまずいてコメントに気づいた。誰かが不思議に思っているのは、それがしばしば悪いデザインの兆候である理由は、コンポーネント間の密接な結合がほとんど必要でない(再び、アクションメソッドの外で)ためです。通常、同じ目的を達成するためにデリゲートまたはコールバックブロックのいずれかをとることができます。
いいえ、これはこのように、メッセージの送信者へのポインタを渡しなしでは不可能である。
- (void) someMethod:(id) sender {
}
[obj someMethod:self];
私は、オブジェクトがある場合は、基礎となるNSObject
(のhash
値を使用することができると思いますNSObject
のサブクラス)。 NSUInteger
のように、それはポインタと同じサイズになるでしょう、しかし、あまりスペース節約はありません。
なぜポインタを使用したくないのですか?
私は、送信者を特定するために*引数を手動で渡す必要はありませんが、依然としてどのオブジェクトであるかを知りたいと考えていると思います。 –
@Justin Spahr-Summers言い換えれば、彼は識別情報を使用して何かを特定したいのですか?プログラミングの問題よりも存在論的ジレンマのように聞こえる。 –
仮説的にObjective-Cランタイムは、そのようなものをサポートすることができます。問題はもちろん、そうではないということです。 –
デザインが悪いですか?この点を拡大できますか? –