首先以NSString为例,来看看copy和mutableCopy的区别是什么?上代码。
NSString *str = @"1";
id obj1 = [str copy];//obj1不可变
id obj2 = [str mutableCopy];//obj2可变
NSLog(@"%p, %p, %p",str,obj1,obj2);
//打印结果:0x100001058, 0x100001058, 0x1002005d0 结论:obj1是浅拷贝str,obj2是深拷贝str
NSMutableString *mutableStr = [[NSMutableString alloc] initWithString:@"2"];
id obj3 = [mutableStr copy];//obj3不可变
id obj4 = [mutableStr mutableCopy];//obj4可变
NSLog(@"%p, %p, %p",mutableStr,obj3,obj4);
//打印结果:0x100606810, 0x3215, 0x1006068a0 结论:obj3和obj4都是深拷贝mutableStr
接下来我们来看看NSArray。
NSArray *array = @[[NSMutableString stringWithString:@"1"]];
id obj1 = [array copy];//obj1不可变
id obj2 = [array mutableCopy];//obj2可变
NSLog(@"%p, %p, %p",array,obj1,obj2);
//打印结果:0x1002043a0, 0x1002043a0, 0x100203950 结论:obj1是浅拷贝array,obj2是深拷贝array
[array[0] appendString:@"2"];
NSLog(@"%@, %@, %@",array[0],obj1[0],obj2[0]);
//打印结果:12, 12, 12 结论:无论数组是copy还是mutableCopy,数组元素都是浅拷贝
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithObjects:[NSMutableString stringWithString:@"1"], nil];
id obj3 = [mutableArray copy];//obj3不可变
id obj4 = [mutableArray mutableCopy];//obj4可变
NSLog(@"%p, %p, %p",mutableArray,obj3,obj4);
//打印结果:0x100700470, 0x100204aa0, 0x100204ac0 结论:obj3和obj4都是深拷贝mutableArray
[mutableArray[0] appendString:@"2"];
NSLog(@"%@, %@, %@",mutableArray[0],obj3[0],obj4[0]);
//打印结果:12, 12, 12 结论:无论数组是copy还是mutableCopy,数组元素都是浅拷贝
结论:
- 对一个拷贝对象进行拷贝操作(copy或mutableCopy)时,只有当拷贝对象和副本对象都是不可变类型时是浅拷贝,其他通通都是深拷贝。
- 对于容器类型(如NSArray)而言,不管容器是做深拷贝还是浅拷贝,容器里的元素都是浅拷贝。
问题:如何能使容器的元素做深拷贝?