2012-02-27 25 views
3

質問からです。私はちょうどthis questionへの回答に追加しましたが、重複してはいけません。Objective-Cの動的バインディングについてまだ混乱しています

@Bavariousからその質問への回答は私には意味がありますが、なぜオブジェクトがIDであっても実行時にメソッドを正しいオブジェクトにバインドできないのは混乱していますか? dynamic bindingまたはdynamic typingというのは、コンパイラはIDの後ろにあるオブジェクトを知る方法がないが、ランタイムはそれを知っていて正しいオブジェクトをメッセージの受信者として選択するはずだということです。なぜランタイムはそれを行うことができないのですか?

+0

注:(-Wstrict-selector-matchを有効にして)警告を出すようにコンパイラに要求することができます(いくつかのシナリオでは)。より良い、メッセージ型修飾された変数とパラメータ、むしろ 'id's。 – justin

答えて

4

短い答え:C.

拡張:コンパイラは、メソッドの呼び出しを生成するとき、それは本当にちょうどC関数の呼び出しを生成している - objc_msgSendに()または変異体、その中に - その動的バインドメソッドをディスパッチします。

C ABIは "金属のところで"実行されるため、引数と戻り値の引き渡し方法は、型に基づいて劇的に変化します。たとえば、コンパイラはレジスタ(またはアーキテクチャによっては64ビット)のサイズで最大32ビットを渡すことができますが、それ以上のものはスタック自体に存在します。

このため、コンパイラは、objc_msgSend()を呼び出すための汎用ビットを生成することはできません。メソッド呼び出し - through(id)を別のシグネチャとしてディスパッチします。メソッド - 異なるコード生成が必要な場合があります。

技術的には、コンパイラは多くの場合同じコードを生成する可能性がありますが、保守的なポリシーを採用して不平を言うことを選択します。特に、2つの型付き宣言が競合している場合は、別の引数型を持つ同じ名前のメソッドを持つことは非常に強く推奨されます。

+0

迅速な返信をありがとう。コンパイル時に型指定された宣言が衝突すると、同じコードが生成される可能性があります。このコードはランタイムにあいまいです。 – neevek

+1

お手伝いします! objc_msgSend()とディスパッチに関して必要以上に多くのことを学びたいなら、私はそれに関する一連のウェブログ記事を書いています:http://www.friday.com/bbum/2009/12/18/objc_msgsend-part- 1-road-map / – bbum

関連する問題