首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在iOS中实现NSMutableArray的深浅拷贝?

如何在iOS中实现NSMutableArray的深浅拷贝?
EN

Stack Overflow用户
提问于 2013-02-24 17:02:06
回答 3查看 1.6K关注 0票数 0

我正在尝试为NSMutableArray实现深拷贝和浅拷贝。

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

发布于 2013-12-13 20:41:11

你可以这样理解..

NSMutableArray *oldArray =[NSMutableArray分配初始容量:0];NSMutableArray *浅拷贝;// =NSMutableArray阵列容量:0;NSMutableArray *深度拷贝;// =[NSMutableArray分配初始容量:0];

代码语言:javascript
复制
//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的相同

票数 2
EN

Stack Overflow用户

发布于 2013-02-24 17:12:23

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2015-07-24 16:56:31

如果NSArray/NSDictionary包含JSON可序列化数据,则可以使用NSJSONSerialization轻松实现深度复制。

只需使用NSJSONSerialization获取NSArrayNSData,然后重新创建JSON对象,这将使用它们的新内存引用创建一个全新的全新NSArray/NSDictionary副本。

但要确保NSArray/NSDictionary的对象及其子对象必须是JSON可序列化的。

代码语言:javascript
复制
NSData *aDataOfSource = [NSJSONSerialization dataWithJSONObject:oldCopy options:NSJSONWritingPrettyPrinted error:nil];
NSDictionary *aDictNewCopy = [NSJSONSerialization JSONObjectWithData:aDataOfSource options:NSJSONReadingMutableLeaves error:nil];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15050196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档