OC中的浅拷贝、单层浅拷贝、深拷贝

1 对于非集合类对象的copy和mutableCopy (以NSString和NSMutableString为例子)

(1) NSString:

NSString *string = @"xiaotaiyang";
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];

NSLog(@"string: %p, %p", string, &string);
NSLog(@"stringCopy: %p, %p", stringCopy, &stringCopy);
NSLog(@"stringMCopy: %p, %p", stringMCopy, &stringMCopy);
运行的结果如下:

string: 0x1022fe078, 0x7fff5d901a48

stringCopy: 0x1022fe078, 0x7fff5d901a40

stringMCopy: 0x608000260240, 0x7fff5d901a38

从上面可以看出对NSString进行copy,字符串对象的内存地址没有发生变化,仅仅是产生了一个新的指针指向字符串对象,但是进行 mutableCopy 操作,其字符串对象的内存地址已经发生了变化,并且产生了一个新的指针指向字符串对象

(2) NSMutableString

NSMutableString *string = [NSMutableString stringWithFormat:@"abc"];
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];

NSLog(@"string: %p, %p", string, &string);
NSLog(@"stringCopy: %p, %p", stringCopy, &stringCopy);
NSLog(@"stringMCopy: %p, %p", stringMCopy, &stringMCopy);

运行的结果如下:

string: 0x608000264680, 0x7fff5526aa48

stringCopy: 0xa000000006362613, 0x7fff5526aa40

stringMCopy: 0x608000264940, 0x7fff5526aa38

对 NSMutableString 进行 copy 操作,其内存地址和指针地址都发生了变化,所以操作是深拷贝,和上面有所不同;进行 mutableCopy 操作,其内存地址和指针地址也都发生了变化,所以也是深拷贝。

2 集合类对象的copy和mutableCopy(NSArray和NSMutableArray为例子)

(1) NSArray

NSString *element_01 = @"abc";
NSString *element_02 = @"def";
NSString *element_03 = @"ghi";
NSArray *array = @[element_01, element_02, element_03];
NSArray *arrayCopy = [array copy];
NSMutableArray *arrayMCopy = [array mutableCopy];

NSLog(@"array: %p, %p; array.firstObject: %p", array, &array, array.firstObject);
NSLog(@"arrayCopy: %p, %p; arrayCopy.firstObject: %p", arrayCopy, &arrayCopy, arrayCopy.firstObject);
NSLog(@"arrayMCopy: %p, %p; arrayMCopy.firstObject: %p", arrayMCopy, &arrayMCopy, arrayMCopy.firstObject);
运行结果如下:

array: 0x600000245910, 0x7fff51367a10; array.firstObject: 0x10e898088
arrayCopy: 0x600000245910, 0x7fff51367a08; arrayCopy.firstObject: 0x10e898088
arrayMCopy: 0x600000245670, 0x7fff51367a00; arrayMCopy.firstObject: 0x10e898088

对 NSArray 进行 copy 操作的时候,数组的内存地址没有发生变化,仅仅是产生了一个新的指针指向数组对象,mutableCopy 操作时,其内存地址发生了变化,但是数组元素的内存地址并没有发生变化

(2) NSMutableArray

NSString *element_01 = @"abc";
NSString *element_02 = @"def";
NSString *element_03 = @"ghi";
NSMutableArray *array = [NSMutableArray arrayWithArray:@[element_01, element_02, element_03]];

NSArray *arrayCopy = [array copy];
NSMutableArray *arrayMCopy = [array mutableCopy];

NSLog(@"array: %p, %p; array.firstObject: %p", array, &array, array.firstObject);
NSLog(@"arrayCopy: %p, %p; arrayCopy.firstObject: %p", arrayCopy, &arrayCopy, arrayCopy.firstObject);
NSLog(@"arrayMCopy: %p, %p; arrayMCopy.firstObject: %p", arrayMCopy, &arrayMCopy, arrayMCopy.firstObject);
运行结果如下:

array: 0x6000000460c0, 0x7fff516d3a10; array.firstObject: 0x10e52c088
arrayCopy: 0x600000046420, 0x7fff516d3a08; arrayCopy.firstObject: 0x10e52c088
arrayMCopy: 0x600000046000, 0x7fff516d3a00; arrayMCopy.firstObject: 0x10e52c088

对 NSMutableArray 进行 copy 和 mutableCopy 操作,其内存地址都发生了变化,但是,对于数组中的元素,不管是进行的哪种操作,内存地址始终都没有发生变化,所以属于单层深拷贝

总结:如果对象想要实现深拷贝,必须实现NSMutableCopying,NSCopying协议或者直接调用

 

[[NSMutableArray alloc] initWithArray:arr copyItems:YES];方法

 

posted @ 2018-12-14 14:36  小太阳521  阅读(240)  评论(0编辑  收藏  举报