0

NSMutableArray のディープ コピーとシャロー コピーを実装しようとしていますが、

self.oldArray =[[NSMutableArray alloc] initWithCapacity:0];
self.shallowCopy =[[NSMutableArray alloc] initWithCapacity:0];
self.deepCopy =[[NSMutableArray alloc] initWithCapacity:0];


//add object to old Array
[self.oldArray addObject:@"rooban"];
[self.oldArray addObject:@"radha"];
[self.oldArray addObject:@"jesus"];
[self.oldArray addObject:@"god"];


self.shallowCopy=[[NSMutableArray alloc] initWithArray:self.oldArray];
self.deepCopy=[[NSMutableArray alloc] initWithArray:self.oldArray copyItems:YES];

//deep copy
NSLog(@"Lenght of the Old Array before: %d",self.deepCopy.count);
[self.deepCopy removeObject:@"rooban"];
NSLog(@"Lenght of the Old Array After: %d",self.oldArray.count);

//shallow copy
NSLog(@"Lenght of the Old Array Before: %d",self.shallowCopy.count);
[self.shallowCopy removeObject:@"rooban"];
NSLog(@"Lenght of the Old Array After: %d",self.oldArray.count);

このプログラムの出力は、

ディープ コピー:
前の古い配列の長さ: 4
古い配列の後の長さ: 4

浅いコピー:
古い配列の長さの前: 4
古い配列の後の長さ: 4

浅いコピーの削除が元の NSMutableArray に反映されない理由がわかりません。

4

3 に答える 3

1

これはinitWithArray:、 が浅いコピーを行っていないために発生します。他の配列と同じオブジェクトへのポインターを持つ完全に新しい配列を取得しています。

たとえば、追加したオブジェクトが可変文字列の場合、そのうちの 1 つを変更すると、同じ可変文字列を指しているため、新しい配列と古い配列の両方で表示されます。

一方、 で作成された配列initWithArray:copyItems:は、元の配列にあったオブジェクトのコピーを指しているため、上記の変更の影響を受けません。

于 2013-02-24T09:12:23.193 に答える
0

NSArray/NSDictionary に JSON シリアライズ可能なデータが含まれている場合、ディープ コピーは を使用して簡単に実現できますNSJSONSerialization

NSDataJSONオブジェクトをNSArray使用しNSJSONSerializationて再作成するだけでNSArray/NSDictionary、新しいメモリ参照を持つ完全に新しいコピーが作成されます。

ただし、NSArray/NSDictionary とその子のオブジェクトが JSON シリアライズ可能であることを確認してください。

NSData *aDataOfSource = [NSJSONSerialization dataWithJSONObject:oldCopy options:NSJSONWritingPrettyPrinted error:nil];
NSDictionary *aDictNewCopy = [NSJSONSerialization JSONObjectWithData:aDataOfSource options:NSJSONReadingMutableLeaves error:nil];
于 2015-07-24T08:56:31.150 に答える