0

これを理解するのに苦労しています...

NSArray内の便利なメソッドであるaddObjectsFromArrayはすべてをコピーしますか、それとも「otherArray」パラメーターをメモリ内に保持し、LinkedListスタイルが「otherArray」の種類の動きに尾を向けますか?

いくつかの既存の配列に重要なオブジェクトへのポインターがあるため、私は尋ねていますが、これらのポインターは着信配列の別のオブジェクトを指している可能性があります。

重要なオブジェクト ポインターを着信配列内のオブジェクトに再ポイントし、着信配列を使用して既存の配列で addObjectsFromArray を呼び出します。

私の心配は、ARC が着信配列をゼロにすることを決定したときに、着信配列が実際にコピーされた場合、再ポイントされた重要なオブジェクトポインターが何も指さないことです。

4

2 に答える 2

3

あなたはこれを考えすぎていると思います。NSArray へのポインタはありません。オブジェクトへのポインターがあり、NSArray にもそのオブジェクトへのポインターがあります。ポインターを再割り当てしても、NSArray 内のポインターは変更されません。

コピーに関しては、NSArray はオブジェクトをコピーしません。しかし、上記のように、ポインターからポインターへのポインターやそのような奇妙なものを保持するのではなく、ポインターをオブジェクトにコピーします。したがって、このコードでは:

NSMutableString *a = [NSMutableString stringWithString:@"Cool"];
NSMutableString *b = a;
NSMutableArray *array = [NSMutableArray array];
[array addObject:a];
NSMutableString *c = [array objectAtIndex:0];
[b appendString:@" beans"];
a = nil;

実行の最後に:

  • bc同じ NSMutableString — "Cool beans" — を保持し、それらのいずれかを変更すると、もう一方に表示されます

  • bこの配列は、「クール ビーンズ」と同じ NSMutableString を保持し、cそこにある文字列にアクセスすると、文字列への変更も表示されます。

  • aゼロになります。これは、変数ではなく文字列を指しているため、リセット時に文字列への他のポインターには影響しませんでした。

するとaddObjectsFromArray:、配列を繰り返し処理して、それぞれを個別に追加したかのようになります。NSArray にはすべてのオブジェクトへのポインターがあるため、他の配列はその時点で消える可能性がありますが、問題にはなりません。

于 2013-01-11T22:18:25.510 に答える
1

オブジェクトへのポインターが配列に追加されaddObjectsFromArrayます。addObjectオブジェクト自体は、インクリメントされる保持カウントを除いて変更されません。

于 2013-01-11T22:17:02.617 に答える