copy 深拷贝和浅拷贝的区别

第一步我们首先创建一个Person的类,Person.h

 1 #import <Foundation/Foundation.h>
 2 //要实现copy必须遵守NSCopying或者NSMutableCopying协议,这里面有一个必须实现的协议copyWithZone:
 3 @interface Person : NSObject<NSCopying>
 4 @property(retain,nonatomic)NSString *name;
 5
 6 @property(copy,nonatomic)NSArray *array;
 7 @property(copy,nonatomic)NSMutableArray *mArray;
 8
 9
10
11
12 @end

Person.m

 1 #import "Person.h"
 2
 3 @implementation Person
 4 -(id)copyWithZone:(NSZone *)zone
 5 {
 6     Person *pp=[[Person alloc]init];
 7     NSLog(@"pp=%p",pp);
 8     pp.name=self.name;
 9     return pp;
10 }
11 @end

第二步,我们来看看 不可变copy和可变copy的区别吧

 1 #import <Foundation/Foundation.h>
 2 #import "Person.h"
 3 int main(int argc, const char * argv[]) {
 4     /*
 5      1、浅拷贝:就相当于retain,只copy了一个对象的引用,和本身是同一个对象,就相当于影子、
 6      2、深拷贝:从新开辟了一块内存空间,用来存放原来对象里面的东西,这个时候,copy出来的对象和原来的对象不是同一个对象,他们的内容一样,就相当于克隆人
 7      3、拷贝出来的的对象是什么类型取决于使用什么拷贝
 8     */
 9
10
11     //1、不可变copy拷贝不可变对象(浅拷贝)
12     /*
13     NSArray *array=[[NSArray alloc]initWithObjects:@"1",@"2", nil];
14     NSArray *array1=[array copy];
15     NSLog(@"array1=%@",array1);
16     NSLog(@"array=%p,array1=%p",array,array1);
17     NSLog(@"array = %lu ,array1 = %lu",[array retainCount],[array1 retainCount]);
18 */
19     //2、不可变copy拷贝可变对象(深拷贝)
20     /*
21     NSMutableArray *mArray=[[NSMutableArray alloc]initWithObjects:@"1",@"2", nil];
22     // NSMutableArray *array=[[NSArray alloc]init];
23     NSArray *array=[mArray copy];
24     NSLog(@"mArray=%p,array=%p",mArray,array);
25     NSLog(@"array=%@",array);
26     NSLog(@"array的类型%@",[array class]);
27     */
28     //3、可变copy拷贝不可变对象(深拷贝)
29     /*
30     NSArray *array=[[NSArray alloc]initWithObjects:@"1",@"2", nil];
31     NSMutableArray *mArray=[array mutableCopy];
32     NSLog(@"-%@",[[array mutableCopy] class]);
33     NSLog(@"array=%p,mArray=%p",array,mArray);
34     NSLog(@"mArray=%@",mArray);
35     */
36     //4、可变copy拷贝可变对象(深拷贝)
37     /*
38     NSMutableArray *mArray=[[NSMutableArray alloc]initWithObjects:@"1",@"2", nil];
39     NSMutableArray *array=[mArray mutableCopy];
40     NSLog(@"%@",[[mArray mutableCopy] class]);
41     NSLog(@"mArray=%p,array=%p",mArray,array);
42     NSLog(@"array=%@",array);
43     */
44
45     //5、自定义类的copy
46     /*
47      要实现copy必须遵守NSCopying或者NSMutableCopying协议,这里面有一个必须实现的协议copyWithZone:
48      */
49
50     Person *p=[[Person alloc]init];
51     p.name=@"张三";
52     Person *p1=[p copy];
53     NSLog(@"p=%p,p1=%p",p,p1);
54     NSLog(@"p1的名字为%@",p1.name);
55
56
57
58     //6、属性的copy
59     /*
60     1、copy修饰不可变属性的时候,就相当于retain
61     2、copy修饰可变属性的时候,相当于不可变copy拷贝可变对象。属于深拷贝,这个时候,属性和对属性赋值的对象的内存都需要单独管理
62     3、建议对象类型都是用retain
63      */
64
65
66
67
68     NSArray *bookArray=[[NSArray alloc]initWithObjects:@"三字经",@"水浒传",@"西游记", nil];
69     p.array=bookArray;
70     NSLog(@"p.array=%p,bookArray=%p",p.array,bookArray);
71     [p.array release];
72     [p.array release];
73
74
75
76
77     NSMutableArray *moneyArray=[[NSMutableArray alloc]initWithObjects:@"1w",@"5W",@"20w" ,nil];
78     p.mArray=moneyArray;
79
80     NSLog(@"p.mArray=%p,moneyArray=%p",p.mArray,moneyArray);
81     [p.mArray release];
82     [moneyArray release];
83
84
85
86
87
88
89
90     return 0;
91 }

最后个人总结:

copy
1.不可变copy拷贝不可变对象(浅拷贝)
2.不可变copy拷贝可变对象 (深拷贝)
不可变copy拷贝拷贝出来的对象是不可变的

3.可变copy拷贝不可变对象(深拷贝)
4.可变copy拷贝可变对象 (深拷贝)
可变copy拷贝拷贝出来的对象是可变的

时间: 2024-10-19 02:31:23

copy 深拷贝和浅拷贝的区别的相关文章

Python中深拷贝与浅拷贝的区别

Python中深拷贝与浅拷贝的区别: 原创 2017年04月20日 16:58:35 标签: python / python两种拷贝 / 深拷贝浅拷贝 / 拷贝区别 1661 定义: 在Python中对象的赋值其实就是对象的引用.当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已. 浅拷贝:拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已.也就是,把对象复制一遍,但是该对象中引用的其他对象我不复制 深拷贝:外围和内部元素都进行了拷贝

Python 深拷贝和浅拷贝的区别

python的复制,深拷贝和浅拷贝的区别    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法,        alist=[1,2,3,["a","b"]] (1)直接赋值,传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变 >>> b=alist        >>> print b        

JS中深拷贝与浅拷贝的区别,实现深拷贝的几种方法

JS中深拷贝与浅拷贝的区别,实现深拷贝的几种方法 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力. 此篇文章中也会简单阐述到栈堆,基本数据类型与引用数据类型,因为这些概念能更好的让你理解深拷贝与浅拷贝. 我们来举个浅拷贝例子: let a=[0,1,2,3,4], b=a; console.log(a===b); a[0]=1; console.log(a,b); 嗯?明明b复

深拷贝与浅拷贝的区别,实现深拷贝的几种方法

JS的基本数据类型 基本数据类型:String,Boolean,Number,Undefined,Null: 引用数据类型:Object(Array,Date,RegExp,Function): 浅拷贝 浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化. Object.assign. 扩展运算符 ... . Array.prototype.slice(). Array.prototype.concat() 等 深拷贝 深

OC中self.xxx和_xxx访问的区别,深拷贝和浅拷贝的区别

初学iOS时候,发现有的代码通过self.xxx访问,有时通过_xxx访问,一直搞不清楚有什么区别.其实,通过self.xxx是对属性进行访问,本质是调用属性的setter方法,属性的引用计数器会+1:_xxx是直接对成员属性进行访问,是对指针的赋值,引用计数器没发生改变.下面,通过代码来看一下. 定义属性: @property (nonatomic, copy)NSString *strCopy1; @property (nonatomic, copy)NSString *strCopy2;

python深拷贝和浅拷贝的区别

首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 深拷贝和浅拷贝需要注意的地方是可变元素的拷贝,在浅拷贝时:拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新

python深拷贝与浅拷贝的区别

可变对象:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值 不可变对象:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象指向的值复制出来一份,然后做了修改后存到另一个地址上了,但是可变对象就不会做这样的动作,而是直接在对象所指的地址上把值给改变了,而这个对象依然指向这个地址 copy.copy:浅拷贝,只拷贝父对象,不会拷贝对象内部的子对象 copy.decopy:深拷贝,拷贝对象及其子对象 在浅拷贝时,拷贝出来的新

js 中引用类型 的深拷贝 和 浅拷贝的区别

一.曾经在读JQ源码的时候,对深拷贝算是有了一点的理解.我们在项目中是不是经常会遇到这样的问题呢? 后台返回一个数组对象(引用类型).次数在页面渲染中需要对部分数据进行处理 比如:银行卡62345092534 (这么长) 但在页面显示的时候, 只显示中国银行(3118)但是传给后台的时候.又要传623445242整个号码,我们也许会把var oldData = res.data; 但是我们发现两个数据都变了? 这是为什么呢? 其实就是一个深浅拷贝的问题. 二.浅拷贝 比如数组,对象,这样的引用类

【JS】深拷贝与浅拷贝的区别,实现深拷贝的几种方法

如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果A没变,那就是深拷贝,自食其力. 此篇文章中也会简单阐述到栈堆,基本数据类型与引用数据类型,因为这些概念能更好的让你理解深拷贝与浅拷贝. 我们来举个浅拷贝例子: let a=[0,1,2,3,4], b=a; console.log(a===b); a[0]=1; console.log(a,b); 嗯?明明b复制了a,为啥修改数组a,数组b也跟着变了,这里我不