どうやらmutableCopyは値ではなく、参照によってコピーします。つまり、私がこれを行う場合:
NSMutableArray arrayA = [arrayB mutableCopy];
次に、arrayBの値を変更すると、arrayAの値も変更されます。
Javaには値でコピーするclone()メソッドがあると思います。ObjectiveCに同等のものはありますか?
どうやらmutableCopyは値ではなく、参照によってコピーします。つまり、私がこれを行う場合:
NSMutableArray arrayA = [arrayB mutableCopy];
次に、arrayBの値を変更すると、arrayAの値も変更されます。
Javaには値でコピーするclone()メソッドがあると思います。ObjectiveCに同等のものはありますか?
このmutableCopy
メソッドは「浅い」コピーを実行します。の各要素arrayA
は、にもあるオブジェクトへの参照arrayB
です。要素を追加arrayA
(または削除)arrayB
すると、変更されません。その逆も同様です。ただし、との要素は同じオブジェクトarrayA
をarrayB
参照しているため、これらのオブジェクトの1つへの変更は、両方の配列に「表示」されます。
の1レベルのディープコピーが必要な場合は、次のarrayB
ように実行できます。
NSMutableArray *arrayA = [[NSMutableArray alloc] initWithArray:arrayB copyItems:YES];
これには次の効果があります。
NSMutableArray *arrayA = [[NSMutableArray alloc] init];
for (id element in arrayB) {
[arrayA addObject:[element copy]]; //copies immutable objects to new array
}
配列をディープコピーするには、以下を使用する必要があります。
NSMutableArray *newArray = [[NSMutableArray alloc] initWithArray: oldArray copyItems:YES];
これcopyWithZone:
により、配列内の各オブジェクトに対してが実行されます
通常の[NSMutableArray copy]
メソッドは、Appleのドキュメントに従って、「コピーが作成されたときの元のオブジェクトと同じ値を持つ機能的に独立したオブジェクト」を返します。おそらくそれを使用する必要があります。
変更可能であることを完全に確認するには、を使用します[[NSMutableArray alloc] initWithArray:[otherArray copy]]
。