美文网首页
Objective-C里的对象Copy

Objective-C里的对象Copy

作者: 码工人生 | 来源:发表于2016-09-17 23:08 被阅读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的方法实现。

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

    相关文章

      网友评论

          本文标题:Objective-C里的对象Copy

          本文链接:https://www.haomeiwen.com/subject/owswettx.html