Fraction* myFraction=[Fraction new];
[myFraction method];
myFraction
はポインタで、メモリアドレスが割り当てられています。 myFraction
のメソッドを使用する場合は、それを使用しないでください* myFraction
?Objective-Cのポインタを理解する方法
Fraction* myFraction=[Fraction new];
[myFraction method];
myFraction
はポインタで、メモリアドレスが割り当てられています。 myFraction
のメソッドを使用する場合は、それを使用しないでください* myFraction
?Objective-Cのポインタを理解する方法
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
まず、私を助けてくれてありがとう。しかし、私の貧しい私の英語を許してください...私は彼らの一部を理解することができます。あなたの答えから、OCはCとは異なります。ちょうど私のインスタンスにメッセージを送ります.Cのような関数を呼び出さないでください。ポインタの問題について考える必要はありません。そうですか? –
私はほとんどそれを修正します。 Objective-CはCの先頭に作られています。 'myFraction'はCのポインタです!しかし、 '[myFraction ...]'形式を使用すると、コンパイラはそれをC互換コードに変更します。 –
こんにちは@RanJi、この答えがあなたに役立つなら、あなたはそれを "Accepted"と書いてもよろしいですか? –
いいえ、それはいけません。 Objective-Cは大括弧の呼び出し構文を使用するときにポインタの逆参照を処理します。 – dasblinkenlight
一般に、Objective Cオブジェクトを参照するポインタは、明示的に参照解除されることはありません。 – clemens
@dasblinkenlightありがとうございます! –