Objective-Cの動的バインディングを使用していますが、どのように?
-
18-09-2019 - |
質問
Iは、Objective-Cのすべてのメソッド呼び出しのためのバインディング動的使用することを知っています。これはどのように実装されていますか? Objective-Cのコンパイルの前に、「Cコードに変わる」とちょうどすべてのために(ボイド*)ポインタを使用していますか?
解決
概念的には、何が起こっていることは、ディスパッチャライブラリ(一般的にObjective Cのランタイムと呼ばれる)があることで、コンパイラは、このようなものを変換します:
[myObject myMethodWithArg:a andArg:b ];
に
//Not exactly correct, but close enough for this
objc_msgSend(myObject, "myMethodWithArg:andArg:", a, b);
そして、すべての結合およびディスパッチとランタイムのお得な情報は、適切な関数を見つけ、それらの引数でそれを呼び出します。単純化すると、あなたは、並べ替えのハッシュ・ルックアップと同じように考えることができます。もちろん、それはその後、現実にはそのはるかに複雑である。
メソッドのシグネチャのようなものに関連する多くの問題が(ランタイムはそれに対処する必要があるので、Cは型をコードしていない)があります。
他のヒント
各目的CメソッドはC関数(効果)として「フードの下で」実現されます。この方法は、それに関連付けられたメッセージ(テキスト文字列)を有し、そしてクラスは、C関数とメッセージ文字列と一致するルックアップテーブルを有しています。あなたはObjective Cのメソッドを呼び出すときに、実際に何が起こるかは、あなたがオブジェクトにメッセージ文字列を送信し、オブジェクトは、そのクラスのメソッドのルックアップテーブルに関連付けられたC関数を検索して、それを実行します。
のObjective Cとそれへのより多くのオブジェクトが、彼らはメッセージ・ツー・メソッドのルックアップをキャッシュする方法、それらを転送することによって理解していない、というように、それが基本だメッセージを処理する方法のように、あります。
C ++の代わりにメッセージテーブルを持つクラスで、それは「vtableの」と呼ばれる何かを持っている、とあなたはテキスト文字列を経由してメソッドを呼び出していないが、そのvtableのへのオフセットを介した以外、同様です。これは、静的な結合の形態であり、そして多少実行を高速化するが、動的バインディング未満柔軟である。