美文网首页
iOS "深拷贝" 与 "浅拷贝"

iOS "深拷贝" 与 "浅拷贝"

作者: 一滴矿泉水 | 来源:发表于2018-08-01 14:00 被阅读0次

1、浅拷贝: 拷贝了指向对象的指针,并没有复制对象本身,两个指针指向同一片地址空间.

2、深拷贝:重新复制了一个新的对象 ,创建了一个新的地址空间.

从上图可以看出,浅拷贝A指针 与 拷贝后的B指针指向了同一片空间。如果有些地方用到B指针,不希望在A指向的内容发生变化时也跟着变化,则需要用到深拷贝

通俗理解为:浅拷贝好比你的影子,你死了,影子也没了;深拷贝好比克隆人,你死了,它还在。

深拷贝和浅拷贝的本质是地址是否相同

在开发过程中,大体上会区分为对象和容器两个概念,对象的copy是浅拷贝,mutablecopy是深拷贝。

( 容器: 容器内元素对象的拷贝,无论是copy,还是mutablecopy都是浅拷贝 )

1. 非容器不可变对象:NSString

2. 非容器可变对象: NSMutableString

3. 容器类不可变对象: NSArray

4. 容器类可变对象: NSMutableArray

代码举例

非容器不可变对象

结论:

1. 对于非容器不可变对象的copy为浅拷贝,mutableCopy为深拷贝

2. 浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象

3. 深拷贝返回新的内存地址,返回对象为可变对象

非容器可变对象

结论:

1. 对于非容器可变对象的copy为深拷贝

2. mutableCopy为深拷贝

3. 并且copy和mutableCopy返回对象都为可变对象

不可变容器

    NSMutableString *str1 = [NSMutableString stringWithFormat:@"不可变容器可变对象"];

    NSArray *array = [NSArray arrayWithObjects:str1, @"不可变容器", nil];

    NSArray *copyArray = [array copy];

    NSArray *mutableCopyArray = [array mutableCopy];

    NSLog(@"array_p: %p, class: %@", array, [array class]);

    NSLog(@"copyArray_p: %p, class: %@", copyArray, [copyArray class]);

    NSLog(@"mutableCopyArray_p: %p, class: %@", mutableCopyArray, [mutableCopyArray class]);

    NSLog(@"======原对象=====");

    NSLog(@"object_p: %p, class: %@", array[0], [array[0] class]);

    NSLog(@"object_p: %p, class: %@", array[1], [array[1] class]);

    NSLog(@"======copy对象=====");

    NSLog(@"object_p: %p, class: %@", copyArray[0], [copyArray[0] class]);

    NSLog(@"object_p: %p, class: %@", copyArray[1], [copyArray[1] class]);

    NSLog(@"======mutableCopy对象=====");

    NSLog(@"object_p: %p, class: %@", mutableCopyArray[0], [mutableCopyArray[0] class]);

    NSLog(@"object_p: %p, class: %@", mutableCopyArray[1], [mutableCopyArray[1] class];


输出:

结论:

从上述输出中可以看出不可变容器mutableCopy确实返回一个新的容器,但容器内的元素仍然是浅拷贝

可变容器

NSMutableString *str1 = [NSMutableString stringWithFormat:@"可变容器可变对象"];

NSMutableArray *array = [NSMutableArray arrayWithObjects:str1, @"可变容器", nil];

NSMutableArray *copyArray = [array copy];

NSMutableArray *mutableCopyArray = [array mutableCopy];

NSLog(@"array_p: %p, class: %@", array, [array class]);

NSLog(@"copyArray_p: %p, class: %@", copyArray, [copyArray class]);

NSLog(@"mutableCopyArray_p: %p, class: %@", mutableCopyArray, [mutableCopyArray class]);

NSLog(@"======原对象=====");

NSLog(@"object_p: %p, class: %@", array[0], [array[0] class]);

NSLog(@"object_p: %p, class: %@", array[1], [array[1] class]);

NSLog(@"======copy对象=====");

NSLog(@"object_p: %p, class: %@", copyArray[0], [copyArray[0] class]);

NSLog(@"object_p: %p, class: %@", copyArray[1], [copyArray[1] class]);

NSLog(@"======mutableCopy对象=====");

NSLog(@"object_p: %p, class: %@", mutableCopyArray[0], [mutableCopyArray[0] class]);

NSLog(@"object_p: %p, class: %@", mutableCopyArray[1], [mutableCopyArray[1] class]);


输出:

结论:

从上述输出中可以看出可变容器mutableCopy和copy都返回一个新的容器,但容器内的元素仍然是浅拷贝

总结:

通过上述代码分析:

copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝

mutableCopy:始终是深拷贝

文章持续更新中、希望对各位有所帮助、有问题可留言 大家共同学习.

相关文章

网友评论

      本文标题:iOS "深拷贝" 与 "浅拷贝"

      本文链接:https://www.haomeiwen.com/subject/jujxpttx.html