第一步我们首先创建一个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拷贝拷贝出来的对象是可变的