2012-02-15 4 views
2

Apple Webサイトの文書によれば、NSObjectを拡張するクラス変数にメッセージを送信すると、objc_msgSend関数を呼び出してクラスのメソッドテーブル内のメソッドを検索します。それが見つからなければ、それはNSObjectに達するまでスーパークラスを通過します。 しかし、我々がIDにメッセージを送信するときに、このブログが言ったように、それは異なる動作をしますようです: http://cocoawithlove.com/2011/06/big-weakness-of-objective-c-weak-typing.htmlidにメッセージを送信するとどうなるのですか?

を、それはすべてのメソッドをルックアップすることによって何を意味するのでしょうか? 誰でも詳細を教えてもらえますか?

+0

Javaの動的メソッド参照は、オブジェクトの実行時クラスを決定し、その時点でオブジェクトがどのクラスにあるかに基づいてメソッドを呼び出します。私はそれがobj-cもやっていると仮定しているが、私はgoogleですばやい検索で何かを見つけることができないようだ。おそらくこれをもっと深く掘り下げてみてください。 –

+0

もう、それについて誰も知りません。 – amao

+0

Javaは静的に動作します。すべてのメソッドバインディングはコンパイル時に行われます。 Objective-cは動的です。実行時にクラスID(isaポインタ)を使用してメソッドをバインドします。 – hburde

答えて

0

ランタイムルックアップとコンパイルルックアップを誤解しているようです。 コンパイル時にコンパイラが必要とするのはメソッドのシグネチャであるため、クラスの型で参照します。 idへのメッセージの送信は、コンパイラが存在するすべてのメソッドを参照することを意味します。 実行時に実行時に実行することは、「クラスが何であるか」の情報によってimpの実際のアドレスを検索することです。

関連する問題