3

質問は、この質問への回答に追加したばかりのコメントからのものですが、重複してはいけません。

その質問に対する@Bavariousからの答えは私には理にかなっていますが、オブジェクトがIDであってもランタイムがメソッドを正しいオブジェクトにバインドできない理由はまだ混乱していますか? 私の理解では、dynamic bindingまたはdynamic typingコンパイラーはIDの背後にあるオブジェクトを知る方法がないということですが、ランタイムはそれを認識し、メッセージの受信者として正しいオブジェクトを選択する必要があります. しかし、なぜランタイムはそれができないのでしょうか?

4

1 に答える 1

4

簡単な答え:C。

拡張:コンパイラがメソッドの呼び出しを生成するとき、実際には、メソッドを動的にバインドしてディスパッチするC関数(objc_msgSend()またはその中のバリアント)への呼び出しを生成するだけです。

C ABIは「金属で」(かなり近い)実行されるため、引数と戻り値が渡される方法は、タイプに基づいて劇的に変化する可能性があります。たとえば、コンパイラはレジスタで最大32ビット(または一部のアーキテクチャでは64ビット)のサイズのものを渡すことができますが、それより大きいものはスタック自体にあります。

このため、コンパイラは、objc_msgSend()を呼び出すための一般的なアセンブリビットを必ずしも発行できるとは限りません。メソッド呼び出しをディスパッチします。別のコード生成が必要です。

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

于 2012-02-27T05:38:37.967 に答える