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

2

可以这样理解。。

NSMutableArray *oldArray =[[NSMutableArray alloc] initWithCapacity:0]; NSMutableArray *shallowCopy; // =[NSMutableArray arrayWithCapacity:0]; NSMutableArray *deepCopy; // =[[NSMutableArray alloc] initWithCapacity:0];

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


shallowCopy = oldArray;
deepCopy = [oldArray mutableCopy];

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

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

输出是:

(-[ViewController viewDidLoad]) (ViewController.m:34) 之前的旧数组的长度:4 (-[ViewController viewDidLoad]) (ViewController.m:36) 之后的旧数组的长度:4 (-[ViewController viewDidLoad] ) (ViewController.m:39) 之前的旧数组的长度:4 (-[ViewController viewDidLoad]) (ViewController.m:41) 之后的旧数组的长度:3

浅拷贝和深拷贝的概念是:

如果 B 是 A 的浅拷贝,那么它就像 B = [A assign];

B 和 A 指向同一个内存位置

如果 B 是 A 的深拷贝,那么就像 B = [A copy];

B 和 A 指向不同的内存位置

B 内存大小与 A 相同

B 与 A 的内容相同

于 2013-12-13T12:41:10.900 回答
1

发生这种情况是因为initWithArray:没有进行浅拷贝。您将获得一个全新的数组,其中包含指向与另一个数组相同的对象的指针。

例如,如果您添加的对象是可变字符串,您可以更改其中一个,并且它在新旧数组中都可见,因为它们指向相同的可变字符串。

另一方面,创建的数组initWithArray:copyItems:不会受到上述更改的影响,因为它指向原始数组中的对象的副本。

于 2013-02-24T09:12:23.193 回答
0

如果 NSArray/NSDictionary 包含 JSON Serialisable 数据,则可以使用NSJSONSerialization.

只需NSData使用然后重新创建 JSON 对象,这将创建一个完整的全新副本,NSArray其中包含它们的新内存引用。NSJSONSerializationNSArray/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 回答