1

私が作成しているプロジェクトには、さまざまなクラスがあります。クラスの 1 つに、別のクラスのオブジェクトを保持する NSMutableArray のインスタンスがあります。この話題については、しっかりと理解しているつもりだったのですが、どういうわけかまた頭の中がごちゃごちゃになってしまいました。

このクラスのインスタンスを初期化するとき、次の初期化メソッドがあります。

- (MMShowMovement *) initWithMovementName: (NSString *) name andNumber: (NSInteger) number {

 if( [super init] ) {

  [self setMovementTitle: name];
  [self setMovementNumber: number];

  [self setDotArray: [[NSMutableArray alloc] init]];

 }

 return self;

}

後で、このクラスのインスタンスが作成された後、オブジェクトを NSMutableArray "dotArray" に追加できます。これがその方法です。

- (void) addDot: (MMDot *) dot {

 [dotArray addObject: dot]; 

}

(私は知っています、それは単純です) このメソッドで「dotArray」を使用すると、このメソッドが呼び出されたクラスのインスタンスの dotArray オブジェクトにアクセスしているのではないでしょうか? または、ここでも self キーワードを使用する必要がありますか?

- (void) addDot: (MMDot *) dot {

 [[self dotArray] addObject: dot]; 

}

正直なところ、よくわかりません。前者だと思いますが、理由はわかりません。また、このメソッドで self キーワードを使用する必要はありません。オブジェクトにアクセスするためにイニシャライザで使用する必要があるのはなぜですか?

4

3 に答える 3

3

self現在の受信者へのポインタです - メッセージを受信したオブジェクトを参照します。
self を使用して、現在のメソッドを実行するオブジェクトにアクセスできます。

あなたの場合、これは、タイプのオブジェクト X がメッセージMMShowMovementを受信した場合addDot:、self に X へのポインターが含まれることを意味します。次の 3 つの方法で
アクセスできます。dotArray

[dotArray addObject:dot]; //directly access the instance variable dotArray
[[self dotArray] addObject:dot]; //access dotArray with an accessor method
//--or--
[self.dotArray addObject:dot]; //access dotArray with an accessor method using dot-syntax

自動 KVO 通知を使用している場合は、(ivar を直接操作する代わりに) アクセサーを使用して通知をトリガーする必要があります。
変数がそのアクセサー メソッドを介してアクセスされるようにするには、プレフィックスを付ける必要があります。self.

于 2010-01-03T10:35:36.910 に答える
2

[self dotArray]は、オブジェクトの「dotArray」セレクター(メソッド)を呼び出します。そのような方法がない場合は、エラーが発生します。プロパティであり、このゲッターメソッドを合成していない限り、この方法でインスタンス変数にアクセスすることはできません。

[dotArray addObject]は単に変数にアクセスし、NSMutableArrayで指定された組み込みメソッドを呼び出します。

[self setMovementTitle:]、[self setMovementNumber:]、および[self setDotArray:]はすべてメソッド呼び出しです。メソッド呼び出しには常にオブジェクト参照が必要です。

initでは、[dotArray addObject]と言った方がよいでしょう(もちろん、変数を初期化した後)。

于 2010-01-03T09:28:34.543 に答える
2

通常、私たちは書きます

self = [super init]  

superの初期化メソッドは、割り当てられたものとは異なるオブジェクトを返す可能性があるためです。そのため、initxxx メソッドでselfを使用し、他の種類のメソッドでselfを使用する必要はありません。

このことは、Apress の Mark Dalrymple と Scott Knaster の著書、Learn Objective-C on the Mac の Chap 10 Object Initialization から明確に学びました。

本からの抜粋:
インスタンス変数は、非表示の自己パラメーターから一定の距離にあるメモリ位置にあります。新しいオブジェクトが init メソッドから返された場合、後続のインスタンス変数の参照がメモリ内の適切な場所に影響を与えるように、self を更新する必要があります。

于 2010-01-03T09:46:11.510 に答える