我正在尝试为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。
发布于 2013-12-13 20:41:11
你可以这样理解..
NSMutableArray *oldArray =[NSMutableArray分配初始容量:0];NSMutableArray *浅拷贝;// =NSMutableArray阵列容量:0;NSMutableArray *深度拷贝;// =[NSMutableArray分配初始容量: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)后旧数组的长度(-ViewController viewDidLoad) (ViewController.m:39)前旧数组的长度:4 (-ViewController viewDidLoad) (ViewController.m:41)后旧数组的长度:3
浅拷贝和深拷贝的概念是:
如果B是A的浅拷贝,那么它就像B=A赋值;
B和A指向相同的内存位置
如果B是A的深拷贝,那么它就像B=A拷贝;
B和A指向不同的内存位置
B内存大小与A内存大小相同
B的内容与A的相同
发布于 2013-02-24 17:12:23
发生这种情况是因为initWithArray:没有执行浅层复制。您将获得一个全新的数组,其中的指针指向与另一个数组相同的对象。
例如,如果你添加的对象是可变字符串,你可以改变其中的一个,它将在新旧数组中都可见,因为它们指向相同的可变字符串。
另一方面,使用initWithArray:copyItems:创建的数组不会受到上述更改的影响,因为它指向原始数组中对象的副本。
发布于 2015-07-24 16:56:31
如果NSArray/NSDictionary包含JSON可序列化数据,则可以使用NSJSONSerialization轻松实现深度复制。
只需使用NSJSONSerialization获取NSArray的NSData,然后重新创建JSON对象,这将使用它们的新内存引用创建一个全新的全新NSArray/NSDictionary副本。
但要确保NSArray/NSDictionary的对象及其子对象必须是JSON可序列化的。
NSData *aDataOfSource = [NSJSONSerialization dataWithJSONObject:oldCopy options:NSJSONWritingPrettyPrinted error:nil];
NSDictionary *aDictNewCopy = [NSJSONSerialization JSONObjectWithData:aDataOfSource options:NSJSONReadingMutableLeaves error:nil];https://stackoverflow.com/questions/15050196
复制相似问题