粗浅的来说copy 是浅复制只复制指针,mutablecopy是深复制复制指针和内容,是在内存的另一份拷贝
详细看一下还是有些许不对
1. 对于一个不可变对象来说 copy 是浅copy 只是指针复制 (这时候用= 赋值和copy一样(=赋值retaincount不变)用copy时retainCount+1,
mutablecopy 是深复制 是对象复制
NSArray *array3 = @[@"12",@"13"];
NSArray *array4;
array4 = array3; // 两个数组的指针指向同一块内存
//array4 = [array3 copy];// 两个数组的指针指向同一块内存
NSLog(@"%li, %li",array4.retainCount, array3.retainCount);
2.对于可变对象来说 copy 和mutablecopy 都是深copy
NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"12",@"13"]];
array0 = array; // 浅复制
array1 = [array copy]; // 对于可变的来说copy和mutablecopy都是深复制
array2 = [array mutableCopy];//
[array removeAllObjects]; // 改变内容, 原来的也会随之改变
NSLog(@"%@, %li, %li, %p", array0, array0.retainCount, array.retainCount, array);
NSLog(@"%@, %li, %li, %p", array1, array1.retainCount, array.retainCount, array1);
NSLog(@"%@, %li, %li, %p", array2, array2.retainCount, array.retainCount, array2);
3.
将指针另外复制一份,(如果修改指针指向的内容) 无论深复制,浅复制容器类内容都会改变
NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *mArray1copy = [mArray1 copy];
// NSLog(@"%ld,%ld",mArray1.retainCount,mArray1copy.retainCount);//2,2
NSMutableArray *mArrayMcopy = [mArray1 mutableCopy];
// NSLog(@"%ld,%ld",mArray1.retainCount,mArrayMcopy.retainCount);//2,1
NSMutableString *temp = [mArray1 objectAtIndex:0];
NSLog(@"%@",temp);//a
[temp appendString:@"aa"]; // 对指针进行修改,
NSLog(@"%@",mArray1);//aaa b c
NSLog(@"%@",mArray1copy); //aaa b c
NSLog(@"%@",mArrayMcopy);// aaa b c
4.对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。
NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject: mArray1]];
NSMutableString *temp2 = [mArray1 objectAtIndex:0];
[temp2 appendString:@"aa"];
NSLog(@"%@",mArray1);//aaa b c
NSLog(@"%@",trueDeepCopyArray);//a b c
//trueDeepCopyArray是完全意义上的深拷贝
对mArray1进行改变不影响trueDeepCopyArray
提醒一下: [array removeAllObjects];是在改变数组的内容
array = nil;是把数组的指针指向空指针位置
各段程序独立运行