2012-02-20 4 views
1

私のロジックが間違っている場合は私を修正してください。ここでは、我々はobjcランタイムについてのご意見

[object doSomething]; 

を行うにObjCではこの

Object.doSomething(); // here we call method directly 

のようなメソッドを呼び出すことができるJavaで

doSomethingのメッセージがオブジェクトに送信されます。私はすべてのオブジェクトがオブジェクトクラスを指すポインタを持っていることを知っている。オブジェクトクラスにそのようなメソッドがあるかどうかを確認するポインタをObjcランタイムで使用します。それが親クラスであるかどうかをチェックします。メソッドが見つかると、objc_msgSendが呼び出されます。

ここで私は混乱しています。

Javaのメソッド呼び出しとObjcのメッセージの違いは何ですか?

これらの利点と欠点は何ですか?

答えて

0

メッセージルーティングは実行時に実行されます(objc) - コンパイル時のメソッドバインディング(java)。 objcランタイムは、実行時にメソッドを解決し、クラス/スーパークラス内で何かを見つけて、それを他のオブジェクト(forwardInvocation)に転送するか、失敗します(メソッドが見つかりません)。それはなぜobjc pplがメッセージ(動的)について話し、java pplがメソッド(静的)について話すのです。利点は、より動的な動作である可能性があるランタイムエラーの欠点です。

+0

Javaメソッドの呼び出しは、実際にコンパイル時にバインドされていません。反射やその他のことはメソッド呼び出しで何が起こるかを変える可能性があるので、この答えは実際には無効です。 –

3

objc_msgSendの動作が混乱しています。objc_msgSendはメッセージを送信するものであり、クラスにメソッドが最初に含まれているかどうかは確認されていません。これは送信フレームワークによって処理されます。これにより、実行時にクラスによってメッセージがNSProxyのように再ルーティングされるようになります。

関連する問題