在OC中,对对象的拷贝可分为深拷贝和浅拷贝。
深拷贝,会生成新的指针和新的内存,新的指针指向新开辟的内存空间,并且会将原来的内存中的内容也拷贝过来。
浅拷贝,会生成新的指针,但是不会开辟新的内存空间,也不会拷贝原来内存中的内容。新生成的指针会指向之前的内存地址。
画个图来说明:
OC中,对对象的拷贝需看改对象本身是否是可变的。
对于可变对象的拷贝:
NSMutableArray *muArr = [[NSMutableArray alloc] init];
[muArr addObject:@"Value1"];
[muArr addObject:@"Value2"];
[muArr addObject:@"Value3"];
NSLog(@"%@ %p %p",muArr, muArr, &muArr);
NSArray *arr1 = [muArr copy];
NSLog(@"%@ %p %p",arr1, arr1, &arr1);
NSMutableArray *arr2 = [muArr mutableCopy];
NSLog(@"%@ %p %p",arr2, arr2, &arr2);
[arr2 addObject:@"Jerry"];
NSLog(@"%@ %p %p",muArr, muArr, &muArr);
NSLog(@"%@ %p %p",arr1, arr1, &arr1);
NSLog(@"%@ %p %p",arr2, arr2, &arr2);
- 对可变对象使用copy或者mutableCopy,都是深拷贝,会生成新的指针对象,并开辟新的内存空间。
对于不可变对象拷贝:
NSArray *arr = @[@"Value1",@"Value2",@"Value3"];
NSLog(@"%@ %p %p",arr, arr, &arr);
NSArray *arr1 = [arr copy];
NSLog(@"%@ %p %p",arr1, arr1, &arr1);
NSMutableArray *arr2 = [arr mutableCopy];
NSLog(@"%@ %p %p",arr2, arr2, &arr2);
[arr2 addObject:@"Tom"];
NSLog(@"%@ %p %p",arr, arr, &arr);
NSLog(@"%@ %p %p",arr1, arr1, &arr1);
NSLog(@"%@ %p %p",arr2, arr2, &arr2);
- 对不可变对象使用copy,会生成新的指针对象,但是不会开辟新的内存空间,是浅拷贝。
- 对不可变对象使用mutableCopy,也会生成新的指针对象,而且会开辟新的内存空间,是深拷贝。
用一个图来总结:
一句话来总结就是:
在OC中,对可变对象的Copy或者mutableCopy都是深拷贝。对不可变对象使用Cpoy是浅拷贝,使用mutableCopy是深拷贝