▍copy和mutableCopy
首要先说明,很多人把copy叫浅拷贝,mutableCopy叫深拷贝,这是不对的。copy、mutableCopy和深拷贝、浅拷贝是两个概念,用法也是不一样的。
copy和mutableCopy分别遵守NSCopying和NSMutableCopying协议,对应实现copyWithZone和mutableCopyWithZone方法。也就是说,只要遵守了NSCopying和NSMutableCopying协议的类,都能实现copy和mutableCopy。比如NSString、NSNumber类(只能实现copy)。
- copy
NSString *string = @"清分";
NSString *copyString = [string copy];
NSLog(@"string:%p",string);
NSLog(@"copyString:%p",copyString);
输出两个地址相同:
string:0x1000a10b0
copyString:0x1000a10b0
NSMutableString *mutableString = [NSMutableString stringWithString:@"明月"];
NSString *copyString2 = [mutableString copy];
NSLog(@"mutableString:%p",mutableString);
NSLog(@"copyString2:%p",copyString2);
输出两个地址不同:
mutableString:0x125f0f290
copyString2:0x125d25600
copy使用原则:
1.obj2 = [obj1 copy]返回的一定是一个不可变对象,无论obj1是否可变。
2.如果obj1是一个不可变对象,那么obj2指向同一个对象(返回自己);如果obj1是一个可变对象,那么obj2指向不同的对象(生成新对象)。
- mutableCopy
NSString *string = @"清分";
NSMutableString *mutableCopyString = [string mutableCopy];
NSLog(@"string:%p",string);
NSLog(@"mutableCopyString:%p",mutableCopyString);
输出两个地址不同:
string:0x1000c50b0
mutableCopyString:0x15fd701f0
NSMutableString *mutableString = [NSMutableString stringWithString:@"明月"];
NSMutableString *mutableCopyString2 = [mutableString mutableCopy];
NSLog(@"mutableString:%p",mutableString);
NSLog(@"mutableCopyString2:%p",mutableCopyString2);
输出两个地址不同:
mutableString:0x15ff3f420
mutableCopyString2:0x15fe29c10
mutableCopy使用原则:
1.obj2 = [obj1 mutableCopy]返回的一定是一个可变对象,无论obj1是否可变。
2.不论obj1是否可变,mutableCopy后的对象都指向不同的地址,也就是都生成了新的对象。
口诀:
不可变copy是引用,可变copy是初始化。
不可变,可变mutableCopy都是初始化。
copy返回不可变对象,mutableCopy返回可变对象。
网友评论