美文网首页
赋值与复制

赋值与复制

作者: anjohnlv | 来源:发表于2017-03-28 13:52 被阅读13次

    说一个基础问题

    Person *p1 = [Person new];
    p1.age = 1;
    Person *p2;
    Person *p3;
    p2 = p1;
    p2.age = 2;
    p3 = p1;
    p3.age = 3;
    

    问:p1、p2、p3的age分别是多少?
    答:p1.age==p2.age==p3.age==3;

    原因就不解释了,不明白的请自己使劲想。
    如果我们想要p1.age==1,p2.age==2,p3.age==3,应该怎么做呢?

    方法1:

    分别实例化不同的对象

    Person *p1 = [Person new];
    p1.age = 1;
    Person *p2 = [Person new];
    p2.age = 2;
    Person *p3 = [Person new];
    p3.age = 3;
    

    实现需求。但如果我们的p1,还有name,birthday,gender,hobby,address等等很多属性,而我们只需要针对他的age进行修改,按照以上的方法,我们不得不分别对每个实例化对象进行若干次重复的赋值操作。

    方法2:

    将p1复制给p2,p3等

    Person *p1 = [Person new];
    Person *p2;
    Person *p3;
    p1.age = 1;
    p2 = [p1 copy];
    p2. age = 2;
    p3 = [p1 copy];
    p3.age = 3;
    

    需要注意的是,虽然Cocoa Touch框架提供了相关的方法,但是想要实现复制,还是需要NSObject的子类实现NSCopying协议及其方法:

    -(instancetype)copyWithZone:(NSZone *)zone
    

    当我们调用copy时,实际上就是调用的默认的

    [self copyWithZone:nil];
    

    在本例中,我们需要实现

    @interface Person : NSObject<NSCopying>
    
    @property(nonatomic, strong)NSString *name;
    @property(nonatomic)int age;
    //若干其他属性
    @end
    
    @implementation Person
    
    -(instancetype)copyWithZone:(NSZone *)zone {
        Person *copy = [[[self class] allocWithZone:zone]init];
        copy.name = self.name;
        copy.age = self.age;
        //以及其他若干的属性复制,如果没有赋值,则复制的person将会丢失这些属性
        return copy;
    }
    
    @end
    
    

    不得不说,其实还是挺麻烦。

    方法3:(后补)

    真的觉得挺麻烦,于是自己尝试封装了一个工具类。
    地址:http://www.jianshu.com/p/3355936f37a3
    如此一来,想实现题干需求,只需要

    Person *p1 = [Person new];
    p1.age = 1;
    Person *p2 = [p1 autoCopy];
    Person *p3 = [p1 autoCopy];
    p2.age = 2;
    p3.age = 3;
    

    即可。

    相关文章

      网友评论

          本文标题:赋值与复制

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