非容器对象:
| NSString | NSMutableString | 不可变对象复制: copy是指针复制(浅拷贝); mutableCopy就是对象复制(深拷贝)。 可变对象复制: 都是深拷贝,但是copy返回的对象是不可变的。 |
copy | 浅copy,不会产生新的地址,两个指针指向同一地址 | 深copy,会产生新的地址,两个指针指向不同地址,并且copy 出来的对象是不可变的。 | |
mutableCopy | 深copy,会产生新的地址,两个指针指向不同地址 | 深copy,会产生新的地址,两个指针指向不同地址 |
系统容器对象:
| NSArray | NSMutableArray | 不可变对象复制: copy是指针复制(浅拷贝); mutableCopy就是对象复制(深拷贝)。 可变对象复制: 都是深拷贝,但是copy返回的对象是不可变的。 对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。 |
copy | 浅copy,不会产生新的地址,两个指针指向同一地址 | 深copy,会产生新的地址,两个指针指向不同地址,并且copy 出来的对象是不可变的。 | |
mutableCopy | 深copy,会产生新的地址,两个指针指向不同地址 | 深copy,会产生新的地址,两个指针指向不同地址 |
总结:
| immutableObject | mutableObject |
copy | 浅copy | 深copy |
mutableCopy | 深copy | 深copy |
集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制 |
NSMutableArray *mArray=[NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c", nil];
NSArray *array1=[mArray copy];
NSMutableArray *mArray1=[mArray copy];
//[mArray1 addObject:@"sss"]; 这一步会出错,因为mutableObject copy返回的对象是不可变的。
NSArray *array2=[mArray mutableCopy];
NSMutableArray *mArray2=[mArray mutableCopy];
NSMutableString *testString = [mArray2 objectAtIndex:0];
[testString appendString:@"new"];//这样以上三个数组的首元素都被改变了