Objective-C里的对象Copy
一.什么叫对象Copy
可能大多开发者对于数组,字典,字符串的copy都有了解,对于浅拷贝和深拷贝更是耳熟能详,但很少听说对拷贝。是的对象拷贝,我们很少用到,因为大多都是对象赋值。不过,我在实际的coding时,还是遇到过几次需要拷贝对象的情景,一上来还真是费了不少周折,所以今天在这里和大家分享下"对象的拷贝".
二.单个对象的Copy
这是一个类名为Person的model,其中有三个属性,我们就拿name这个属性来讲解吧。
@interface Person : NSObject
@property (nonatomic,copy) NSString * name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,assign) BOOL gender;
@end
这是在Controller,对Person的一系列操作:
Person * person1 = [[Person alloc]init];
person1.name = @"王一";
Person * person2 = [[Person alloc]init];
person2 = person1;
Person * copyPerson = [person1 copy];
copyPerson.name = person1.name;
person1.name = @"张三";
NSLog(@"person1--%@",person1.name);
NSLog(@"person2--%@",person2.name);
NSLog(@"copyPerson--%@",copyPerson.name);
打印结果:
22:19:23.748 [4141:95809] person1--张三
22:19:23.748 [4141:95809] person2--张三
22:19:23.749 [4141:95809] copyPerson--王一
看下,Person2是Person1直接赋值过去的,当person1.name改变时,person2.name的值也改变了。
而此时copyPerson是person1通过copy过来的,它里面的name的值就不会改变,其实很多时候我们不就是想要的是这种结果嘛。那么,当直接调用[person1 copy]时,系统会崩溃的,那么玄机就在这里:
要遵守NSCopying协议,并要实现- (id)copyWithZone:(NSZone *)zone这个协议方法,就可以实现对象的Copy.
三.数组里的对象的Copy.
有时我们需要对一个数组进行保存,这个保存数组里一定是保存的数组最原始的值。不管当前数组做了什么操作,保存数组一定要保证原始值。
Person * person1 = [[Person alloc]init];
person1.name = @"王一";
Person * person2 = [[Person alloc]init];
person2.name = @"王二";
NSArray * array1 = [[NSArray alloc]initWithObjects:person1,person2, nil];
NSArray * tempArray1 = [array1 copy];
NSArray * tempArray2 = [array1 mutableCopy];
NSMutableArray * tempArray3 = [NSMutableArray array];
for (Person * item in array1) {
Person * tempPerson = [item copy];
[tempArray3 addObject:tempPerson];
}
Person * personW = [array1 objectAtIndex:0];
personW.name = @"张三";
Person * tempPerson1 = [tempArray1 objectAtIndex:0];
Person * tempPerson2 = [tempArray2 objectAtIndex:0];
Person * tempPerson3 = [tempArray3 objectAtIndex:0];
NSLog(@"tempArray1--%@",tempPerson1.name);
NSLog(@"tempArray2--%@",tempPerson2.name);
NSLog(@"tempArray3--%@",tempPerson3.name);
看下打印结果:
2016-09-17 22:51:18.995 tempArray1--张三
2016-09-17 22:51:18.996 tempArray2--张三
2016-09-17 22:51:18.996 tempArray3--王一
由上面打印结果,我们看到array浅拷贝,深拷贝得到的array1和array2都会随着array对象的属性改变而改变,只有通过copy建立的array3的对象还是最初array1的值,这就实现了们保存数组的目的。
当然,保存数组最原始值其实不止这一种方法,还有其他方法,由于本文主要讲对象copy,所以数组保存我就用对象copy的方法实现。
欢迎讨论交流,批评指正!!!