深拷贝和浅拷贝
#需求:
A模型 中存放着 多个自定义模型TagModel,
需要将 A模型 中的TagModel数组 拷贝到 B数组 中,
并修改 B数组中的元素,不能影响到A数组,
如果B数组保存成功后回调替换 A模型中的tagModel数组。
这是项目中的常见场景,也是数组拷贝的常见问题,这里分几部讲解
1.深拷贝和浅拷贝的概念;
2.简单数组元素的拷贝;
3.模型数组元素的拷贝;
#一、 深拷贝和浅拷贝的概念
浅拷贝即指针拷贝,不会产生新的对象,使用的是同一块内存地址。浅拷贝是对内存地址的复制,让目标对象指向 和 源对象 指向同一片内存空间。
深拷贝是内容拷贝,会产生新的对象,产生新的地址。
#二、 基本类型 的数组拷贝
###2.1 NSArray 与 copy/mutableCopy
运行代码:
NSArray *normalArray = [NSMutableArray arrayWithObjects:@(0),@(1),@(2), nil];
id copyArray = [normalArray copy];
id mutableCopyArray = [normalArray mutableCopy];
NSLog(@"tempArray=%@",[copyArray isKindOfClass:[NSMutableArray class]] ?@"可变数组":@"不可变数组");
NSLog(@"tempArray2=%@",[mutableCopyArray isKindOfClass:[NSMutableArray class]] ?@"可变数组":@"不可变数组");
mutableCopyArray[0] = @(80);
NSLog(@" \nnormalArray=%p\n copyArray=%p\n mutableCopyArray=%p",normalArray,copyArray,mutableCopyArray);
NSLog(@"normalArray=%@\n copyArray=%@\n mutableCopyArray=%@",normalArray,copyArray,mutableCopyArray);
打印结果为:
2019-09-03 22:34:18.932275+0800 xiaojian[901:136568] tempArray=不可变数组
2019-09-03 22:34:18.932467+0800 xiaojian[901:136568] tempArray2=可变数组
2019-09-03 22:34:18.932535+0800 xiaojian[901:136568]
normalArray =0x28333c0c0
copyArray =0x28333e2e0