私はいくつかのコードを見ていて、少し調査を行った->
ように使用されているシンボルに出くわし、基本的には同じであることがわかりましたが、実際に何をしているのか、何をしているのかはわかりません。obj->method(argument);
[obj method:argument];
->
私の質問は、->
objective-c でシンボルが意味するものは何ですか?
私はいくつかのコードを見ていて、少し調査を行った->
ように使用されているシンボルに出くわし、基本的には同じであることがわかりましたが、実際に何をしているのか、何をしているのかはわかりません。obj->method(argument);
[obj method:argument];
->
私の質問は、->
objective-c でシンボルが意味するものは何ですか?
これは、ポインターを介してstruct
内のフィールドにアクセスするために使用される Cの逆参照演算子と同じことを意味します。struct
struct mystruct
{
int field;
};
struct mystruct *mystruct = ...;
printf("field=%d\n", mystruct->field);
Objective-C では、Objective-C オブジェクト内のフィールドにアクセスするためにも使用できます。
@interface MyObj : NSObject
{
@public
int field;
}
@end
MyObj *myObj = [[MyObj alloc] init];
NSLog(@"field=%d", myObj->field);
これらのフィールドは、宣言されている場合にのみ外部からアクセスできることに注意してください@public
。
私はいくつかのコードを見ていて、シンボルに出くわしました-> obj->method(argument); のように使用されています。少し調べてみたところ、基本的に [obj method:argument]; と同じであることがわかりました。しかし、私は -> 実際に何をしているのか、何をしているのかわかりません。
私の質問は、objective-c での -> 記号の意味は何ですか?
C での意味とまったく同じです。C 構造体のアイテムにアクセスするためのものです。昔は、Objective-C は純粋に C プリプロセッサ拡張 + ランタイムとして実装されていました。クラスは連結された C 構造体に過ぎず、プリプロセッサは各 ivar アクセスを に変換しましself->ivar
た。
つまり、(クラスのメソッドで) 同じことivar
を行います。self->ivar
これで、他のオブジェクト (@public) の ivar を突くことができます。->
しかし、しないでください。これは、Objective-C のカプセル化の行がメソッド インターフェイスで描画されるため、カプセル化を正確に中断します。動作を監視またはオーバーライドできるように、常にセッター/ゲッターを使用してください。
最後に、いいえ、もうそのようなものはありませobj->method(argument)
ん。かつて、 Modern Syntaxと呼ばれる失敗した実験がありましたが、無意味な時間の無駄であったため放棄されました。->
メソッドの呼び出しには使用できません。