代码dataArray3=[dataArray2 mutableCopy];只是对数组dataArray2本身进行了内容拷贝,但是里面的字符串对象却没有进行内容拷贝,而是进行的浅复制,那么dataArray2和dataArray3里面的对象是共享同一份的。所以才会出现上面的情况。
单层深复制
那么如何解决上面的问题呢?
可以使用如下代码
dataArray3=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];
输出如下:
2016-07-31 17:45:48.472 test1[2151:173221] dataArray3:(
one,
two,
three,
four,
(
1,
2,
3,
4
)
)
2016-07-31 17:45:48.472 test1[2151:173221] dataArray2:(
"one--ONE",
two,
three,
four,
(
1,
2,
3,
4
)
)
可以看到dataArray3并没有被改变,但是别高兴的太早,我们再来改改。
代码如下:
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=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];
NSMutableArray *mArr = (NSMutableArray *)dataArray2[4];
mStr = mArr[0];
[mStr appendString:@"--ONE"];
NSLog(@"dataArray3:%@",dataArray3);
NSLog(@"dataArray2:%@",dataArray2);
输出如下:
2016-07-31 17:47:19.421 test1[2174:174714] dataArray3:(
one,
two,
three,
four,
(
"1--ONE",
2,
3,
4
)
)
2016-07-31 17:47:19.421 test1[2174:174714] dataArray2:(
one,
two,
three,
four,
(
"1--ONE",
2,
3,
4
)
)
可以看到深复制又失效了,这是因为dataArray3=[[NSMutableArray alloc]initWithArray:dataArray2 copyItems:YES];仅仅能进行一层深复制,对于第二层或者更多层的就无效了,那怎么办呢?
别急,我们还有大招没放。
完全复制
要想对多层集合对象进行复制,我们需要进行完全复制,这里可以使用归档和接档。
实现代码如下:










