深拷贝与浅拷贝

在OC中对象之间的拷贝分为浅拷贝和深拷贝。

存在4种情况:

(1)对 非容器类不可变对象 的copy

NSString *str = @"1234";

NSMutableString *str1 = [str copy];

NSMutableString *str2 = [str mutableCopy];

[str2 appendString:@"55"];

NSLog(@"str地址-------%p---%@",str,str);

NSLog(@"str1地址-------%p",str1);

NSLog(@"str2地址-------%p---%@",str2,str2);

结果如下:(str和str1指针所指向的地址一样)

 str地址-------0x101840078---1234

 str1地址-------0x101840078

str2地址-------0x608000074b40---123455

(2)对 非容器的可变对象 的copy

NSMutableString *str3 = [NSMutableString stringWithFormat:@"hhhhh"];

NSMutableString *str4 = [str3 copy];

//    [str4 appendString:@"0000000"];

NSMutableString *str5 = [str3 mutableCopy];

[str5 appendString:@"1111111"];

NSLog(@"str3-----%p",str3);

NSLog(@"str4-----%p----%@",str4,str4);

NSLog(@"str5-----%p----%@",str5,str5);

运行结果如下:(三个指针指向的地址都不一样)

 str3-----0x60800007f700

 str4-----0xa000068686868685----hhhhh

 str5-----0x60800007f740----hhhhh1111111

(3)对 容器类不可变对象的copy

NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];

NSMutableArray *array1 = [array copy];

NSMutableArray *array2 = [array mutableCopy];

[array2 addObject:@"666"];

NSLog(@"array地址-------%p",array);

NSLog(@"array1地址-------%p",array1);

NSLog(@"array2地址-------%p---%@",array2,array2);

运行结果如下:(array和array1的指针所指向的地址一样)

 array地址-------0x60800005ec90

array1地址-------0x60800005ec90

array2地址-------0x60800005e930

(4)对 容器类可变对象的copy

NSMutableArray *array3 = [NSMutableArray arrayWithObjects:@"4",@"5",@"6", nil];

NSMutableArray *array4 = [array3 copy];

NSMutableArray *array5 = [array3 mutableCopy];

[array5 addObject:@"8888"];

NSLog(@"array3地址-------%p",array3);

NSLog(@"array4地址-------%p",array4);

NSLog(@"array5地址-------%p---%@",array5,array5);

运行结果如下:(指针指向地址都不一样)

 array3地址-------0x60000005e4e0

 array4地址-------0x60000005e090

array5地址-------0x60000005e360

由以上四种情况,可以得出结论:

copy:对于可变对象为深复制,对于不可变对象是浅复制。始终返回一个不可变对象。

mutableCopy:始终是深复制,始终返回一个可变对象。

你可能感兴趣的:(深拷贝与浅拷贝)