前言
OC对象的三种拷贝方式
OC的对象拷贝有如下三种方式,很多时候我们把深复制和完全复制混为一谈,其他他们是有区别的,具体如下
浅复制(shallow copy):在浅复制操作时,对于被复制对象的每一层都是指针复制。
深复制(one-level-deep copy):在深复制操作时,对于被复制对象,至少有一层是深复制。
完全复制(real-deep copy):在完全复制操作时,对于被复制对象的每一层都是对象复制。
两图以避之


理解深复制(mutableCopy)
浅复制很简单,就不演示了,看上面的图就懂了,只是简单的指针拷贝,所以改变原对象或者拷贝后的对象,都会影响另外一个对象。
从上图我们可以看到mutableCopy对于任何对象都是内容复制,也就是说进行了深复制。
上代码:
NSMutableArray * dataArray1=[NSMutableArray arrayWithObjects:
[NSMutableString stringWithString:@"1"],
[NSMutableString stringWithString:@"2"],
[NSMutableString stringWithString:@"3"],
[NSMutableString stringWithString:@"4"],
nil
];
NSMutableArray * dataArray2=[NSMutableArray arrayWithObjects:
[NSMutableString stringWithString:@"one"],
[NSMutableString stringWithString:@"two"],
[NSMutableString stringWithString:@"three"],
[NSMutableString stringWithString:@"four"],
dataArray1,
nil
];
NSMutableArray * dataArray3;
NSMutableString * mStr;
dataArray3=[dataArray2 mutableCopy];
mStr = dataArray2[0];
[mStr appendString:@"--ONE"];
NSLog(@"dataArray3:%@",dataArray3);
NSLog(@"dataArray2:%@",dataArray2);
输出如下:
2016-07-31 17:40:30.702 test1[2113:169774] dataArray3:(
"one--ONE",
two,
three,
four,
(
1,
2,
3,
4
)
)
2016-07-31 17:40:30.703 test1[2113:169774] dataArray2:(
"one--ONE",
two,
three,
four,
(
1,
2,
3,
4
)
)
看上面的输出,我们发现我们改变原数组dataArray2,竟然也会影响深复制后的dataArray3,不是说好的内容复制吗,为什么会这样?
这里我们来说说深复制和完全复制的区别。
我们知道深复制,就是把原有对象的内容直接克隆一份到新对象,但是这里有一个坑就是他只会复制一层对象,而不会复制第二层甚至更深层次的对象。










