2017-12-30 44 views
1
Fraction* myFraction=[Fraction new]; 
[myFraction method]; 

myFractionはポインタで、メモリアドレスが割り当てられています。 myFractionのメソッドを使用する場合は、それを使用しないでください* myFractionObjective-Cのポインタを理解する方法

+1

いいえ、それはいけません。 Objective-Cは大​​括弧の呼び出し構文を使用するときにポインタの逆参照を処理します。 – dasblinkenlight

+0

一般に、Objective Cオブジェクトを参照するポインタは、明示的に参照解除されることはありません。 – clemens

+0

@dasblinkenlightありがとうございます! –

答えて

3

Cの代わりに、Objective-Cは実際には動的にディスパッチされます。つまり、実際にObjective-Cオブジェクト。むしろ、あなたはインスタンスに「メッセージを送る」。 Objective-Cランタイムは、そのメッセージの実際の変換をC関数呼び出しに処理します。

例では、[myFraction method]は実際にobjc_msgSend(myFraction, @selector(method))に似たものにコンパイルされます。

objc_msgSend()機能はObjective-Cの核心です。サポートされているプラ​​ットフォームごとに手はwritten in assemblyです。このアセンブリコールの中で、ランタイムはインスタンスのタイプ(この場合はFraction)を決定し、分数クラスの既知のインスタンスメソッドを検索します。メソッドが見つからない場合は、Fractionのスーパークラスをルート(NSObject)まですべて検索します。

-[Fraction method]の適切なC関数が特定されると、objc_msgSendがそれを呼び出します。

興味深いことに、結果として得られるC関数呼び出しには実際には2つの追加引数(myFractionポインタと元のメソッドセレクタ)が用意されています。これらは、-[Fraction method]に書き込んだコードを実行する前に、抜き取られてself_cmdに格納されます。これは、インスタンスの状態がインスタンス関数に伝達される方法です。かなりクール:)

いくつかの読書:

https://www.mikeash.com/pyblog/friday-qa-2012-11-16-lets-build-objc_msgsend.html

+0

まず、私を助けてくれてありがとう。しかし、私の貧しい私の英語を許してください...私は彼らの一部を理解することができます。あなたの答えから、OCはCとは異なります。ちょうど私のインスタンスにメッセージを送ります.Cのような関数を呼び出さないでください。ポインタの問題について考える必要はありません。そうですか? –

+1

私はほとんどそれを修正します。 Objective-CはCの先頭に作られています。 'myFraction'はCのポインタです!しかし、 '[myFraction ...]'形式を使用すると、コンパイラはそれをC互換コードに変更します。 –

+0

こんにちは@RanJi、この答えがあなたに役立つなら、あなたはそれを "Accepted"と書いてもよろしいですか? –

関連する問題