Objective-C里的对象Copy

2016-09-17  本文已影响23人  码工人生

一.什么叫对象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的方法实现。

欢迎讨论交流,批评指正!!!

上一篇下一篇

猜你喜欢

热点阅读