关于深拷贝和浅拷贝的理解

一、深拷贝与前拷贝的区别

浅拷贝是拷贝指针,深拷贝是拷贝对象内容。

二、关于遵循NSCopy和NSMutableCopy协议后的copy及mutablCopy区别

1、非集合不可变对象,copy是浅拷贝,mutableCopy是深拷贝;

2、非集合可变对象,copy和mutableCopy是深拷贝;

3、集合不可变对象,copy是浅拷贝,mutableCopy是深拷贝,但集合中的对象还是浅拷贝;

4、集合可变对象,copy和mutableCopy是深拷贝,但集合中的对象均是浅拷贝。

三、如何实现集合中的对象也是深拷贝呢?

1、用 initWithArray:copyItems: 将第二个参数设置为YES即可深复制,如:

NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

2、将集合进行归档(archive),然后解档(unarchive),如:

NSArray *trueDeepCopyArray = [NSKeyedUnarchiever unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

学会判断,进行拷贝操作时,被拷贝的是指针还是内容即可。

时间: 2024-12-15 06:54:18

关于深拷贝和浅拷贝的理解的相关文章

python 中 深拷贝和浅拷贝的理解

在总结 python 对象和引用的时候,想到其实 对于python的深拷贝和浅拷贝也可以很好对其的进行理解. 在python中,对象的赋值的其实就是对象的引用.也就是说,当创建一个对象,然后赋给另外一个变量之后,实际上只是拷贝了这个对象的引用. 我们先用  利用切片操作和工厂方法list方法 来阐述一下浅拷贝. 举个栗子: Tom = ['Tom', ['age', 10]] Jack = Tom[:] ……切片操作 June = list(Tom) 接下来查看一下 上述三个变量的引用: >>

对深拷贝及浅拷贝的理解

1.两个拷贝之间主要是用于对象之间的拷贝! 2.区别 没指针: 深拷贝和浅拷贝没什么区别: 有指针: 浅拷贝:即对象的默认拷贝函数,只是将指针的地址拷贝给对象,两个变量同时指向一个地址,这样在析构的时候必然会导致程序崩溃: 1 class A 2 { 3 public: 4 A() 5 { 6 m_Data = new char[100]; 7 } 8 ~A() 9 { 10 delete []m_Data; 11 m_Data = NULL; 12 } 13 14 protected: 15

关于Python中深拷贝与浅拷贝的理解(一)---概念

import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改对象a中的['a', 'b']数组对象 print 'a = ', a print 'b = ', b print 'c = ', c print 'd = ', d 输出为:a

C++深拷贝和浅拷贝细节理解

前提 在对象拷贝过程中,如果没有自定义拷贝构造函数,编译器会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型的成员变量则调用其相应的拷贝构造函数. 资料注解 在<高质量的C C++编程>第9章有这样一段话如下,类似的描述在<C++ primer>和<effective C++>都有提及,就是拷贝构造函数的问题,这是OO编程必须注意的一个问题. 详细原文链接:https://blog.csdn.net/weixin_411436

php深拷贝与浅拷贝

http://www.cnblogs.com/taijun/p/4208008.html 先说一下深拷贝和浅拷贝通俗理解 深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个 浅拷贝:赋值时,引用赋值,相当于取了一个别名.对其中一个修改,会影响另一个 PHP中, = 赋值时,普通对象是深拷贝,但对对象来说,是浅拷贝.也就是说,对象的赋值是引用赋值.(对象作为参数传递时,也是引用传递,无论函数定义时参数前面是否有&符号) php4中,对象的 = 赋值是实现一份副本,这样存在

Javascript中的深拷贝和浅拷贝

文章目录 JavaScript中的变量类型 深拷贝和浅拷贝的理解 深拷贝和浅拷贝的实现方式 为什么需要深拷贝和浅拷贝 JavaScript中的变量类型 (1).基本类型 JavaScript中的基本类型有五种: null.undefined.boolean.string.number. 变量是按值存放的,存放在栈中的简单数据段,可以直接访问. (2).引用类型 引用类型包括对象和数组,其存储在堆当中,而变量是指针,指向堆. 当我们访问的时候,实际上是访问指针,然后指针去寻找对象或数组. 深拷贝与

PHP中对象的深拷贝与浅拷贝

先说一下深拷贝和浅拷贝通俗理解 深拷贝:赋值时值完全复制,完全的copy,对其中一个作出改变,不会影响另一个 浅拷贝:赋值时,引用赋值,相当于取了一个别名.对其中一个修改,会影响另一个 PHP中, = 赋值时,普通对象是深拷贝,但对对象来说,是浅拷贝.也就是说,对象的赋值是引用赋值.(对象作为参数传递时,也是引用传递,无论函数定义时参数前面是否有&符号) <?php //普通对象赋值,深拷贝,完全值复制 $m = 1; $n = $m; $n = 2; echo $m;//值复制,对新对象的

完全理解python深拷贝和浅拷贝

import copya = [1, 2, 3, 4, ['a', 'b']]  #原始对象b = a  #赋值,传对象的引用c = copy.copy(a)  #对象拷贝,浅拷贝d = copy.deepcopy(a)  #对象拷贝,深拷贝a.append(5)  #修改对象aa[4].append('c')  #修改对象a中的['a', 'b']数组对象print 'a = ', aprint 'b = ', bprint 'c = ', cprint 'd = ', d 输出结果:a = 

深拷贝 与浅拷贝理解与实现

在js中对象与数组之间的拷贝分为深拷贝与浅拷贝,浅拷贝即是单层的拷贝,将一个对象或者数组拷贝到另一个变量中,此时都指向同一个数组,话不多说,我们来看例子: let obj1 = {a:3,b:4,z:{x:5,t:6}} // 将此对象赋值给另一个对象,浅拷贝的方法实现 let obj2 = Object.assign({},obj1) //assign实现浅拷贝 let obj3 = {...obj1}//ES6解构赋值实现浅拷贝 function copy(obj){ if(obj == n