美文网首页
深复制和浅复制

深复制和浅复制

作者: Joshua520 | 来源:发表于2017-07-26 10:30 被阅读16次

概念

对象拷贝有两种方式:浅复制和深复制。顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针;深复制是直接拷贝整个对象内存到另一块内存中。
简言之:浅复制就是指针拷贝;深复制就是内容拷贝。

String对象的copy与mutableCopy

首先先探究一下复制源为immutable类型的情况下copy与mutableCopy。

NSString *string = @"hello";
NSString *copyString = [string copy];

NSMutableString *mutableString = [string mutableCopy];
NSLog(@"string=%@ address: %p",string,string);
NSLog(@"copystring=%@ address: %p",copyString,copyString);
NSLog(@"mutablestring=%@ address: %p",mutableString,mutableString);

输出结果

MainViewController.m:51 string=hello address: 0x10db47780
MainViewController.m:52 copystring=hello address:    0x10db47780
MainViewController.m:53 mutablestring=hello address: 0x606000101b40

再次探究一下复制源为mutable类型的情况下copy与mutableCopy。

NSMutableString *string = [NSMutableString stringWithString:@"hello"] ;
NSString *copyString = [string copy];
NSMutableString *mutableString = [string mutableCopy];
NSLog(@"string=%@ address: %p",string,string);
NSLog(@"copystring=%@ address: %p",copyString,copyString);
NSLog(@"mutablestring=%@ address: %p",mutableString,mutableString);

输出结果

MainViewController.m:52 string=hello address: 0x606000109fa0
MainViewController.m:53 copystring=hello address: 0xa00006f6c6c65685
MainViewController.m:54 mutablestring=hello address: 0x606000109f40

综上输出结果可以看出:在非集合类对象中:对immutable对象进行copy操作,是指针复制,mutableCopy操作时内容复制;对mutable对象进行copy和mutableCopy都是内容复制。用代码简单表示如下:

[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制

集合类的copy与mutableCopy

同理你先看复制源为immutable类型下的copy与mutablecopy。

NSArray *array = @[@"1", @"2"];
NSArray *copyArray = [array copy];
NSMutableArray *mutablecopyArray = [array mutableCopy];
NSLog(@"array address: %p", array);
NSLog(@"copyArrayaddress: %p", copyArray);
NSLog(@"mutablecopyArray address: %p", mutablecopyArray);

输出结果

MainViewController.m:59 array address: 0x6030000cfbb0
MainViewController.m:60 copyArrayaddress: 0x6030000cfbb0
MainViewController.m:61 mutablecopyArray address: 0x604000098350

再来看看复制源为mutable类型下的copy与mutablecopy。

NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
NSArray *copyArr = [mutableArray copy];
NSMutableArray *mutablecopyArr = [mutableArray mutableCopy];
NSLog(@"mutableArray address: %p", mutableArray);
NSLog(@"copyArraddress: %p", copyArr);
NSLog(@"mutablecopyArraddress: %p", mutablecopyArr);

输出结果

MainViewController.m:66 mutableArray address: 0x6040000982d0
MainViewController.m:67 copyArraddress: 0x6030000cfb80
MainViewController.m:68 mutablecopyArraddress: 0x604000098290

通过对比输出内存地址可以看出,在集合类对象中,对immutable对象进行copy,是指针复制,mutableCopy是内容复制;对mutable对象进行copy和mutableCopy都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:

[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制

参考文档

Apple Collections Programming Topics: Copying Collections

IOS开发之深拷贝与浅拷贝(mutableCopy与Copy)详解

iOS 集合的深复制与浅复制

相关文章

  • 深拷贝与浅拷贝的理解及常用方法

    深拷贝和浅拷贝的区别 首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。简单来说,浅复制只...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • iOS全解11:特殊问题

    1、浅拷贝和深拷贝的区别? 浅拷贝:只复制指向对象的指针,指针指向同一个地址,而不复制引用对象本身。深拷贝:复制引...

  • Javascript对象的深浅拷贝

    开门见山,有人叫对象的复制为深复制浅复制,也有人叫深拷贝浅拷贝。其实都是copy。 深拷贝(递归复制,复制所有层级...

  • 浅|深 复制

    浅复制 //只写main函数 //结果是 我们可以看到一旦pointArray1发生了改变pointArray2也...

  • 拷贝与内存管理

    一、关于深拷贝和浅拷贝的总结 理解 本质上我认为区别在于复制是是指针复制(浅拷贝)还是复制到新的地址上(深拷贝) ...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • 浅复制(浅拷贝)和深复制(深拷贝)

    js存储机制 JS中对象分为基本类型和复合(引用)类型,基本类型存放在栈内存,复合(引用)类型存放在堆内存。堆内存...

  • Java 浅拷贝和深拷贝 拷贝和复制

    Java 复制与拷贝 大纲 浅拷贝和深拷贝 浅拷贝就是复制对象的一个精确副本 ==对于基本数据类型就是复制值,对于...

  • python中的浅拷贝和深拷贝

    浅拷贝和深拷贝: 浅拷贝 shallow copy 浅拷贝是指在对象复制过程中,只复制一层变量,不会复...

网友评论

      本文标题:深复制和浅复制

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