ios - iOS中NSMutableArray如何实现深拷贝和浅拷贝?

标签 ios shallow-copy deep-copy

我正在尝试为 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

我不知道为什么浅拷贝删除没有反射(reflect)到原始 NSMutableArray。

最佳答案

你可以这样理解..

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有相同的内容

关于ios - iOS中NSMutableArray如何实现深拷贝和浅拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15050196/

相关文章:

python - Networkx 复制说明

arrays - GO - 数组复制是深拷贝还是浅拷贝?

vb.net - VB.NET,对象是通过函数引用返回的

class - BodyKt $ main $ Person @ 35cabb2a是什么?我可以得到它的属性吗?

ios - 给定数据不是有效的 JSON - 第二次搜索后发生

ios - 可以在 objective c 中使用 swift 中的 array reduce 概念吗?

ios - UIImagePickerController 预览大小与实时大小不一样

c++ - C++中的默认赋值运算符=是浅拷贝?

C 浅拷贝混淆

ios - 有什么方法可以获取在构建时使用的xcode版本?