copy、mutableCopy

▍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返回可变对象。

你可能感兴趣的:(copy、mutableCopy)