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拷贝拷贝出来的对象是可变的

posted @ 2015-09-24 15:39  YX祥  阅读(402)  评论(0编辑  收藏  举报