赋值与复制

说一个基础问题

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

@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;

即可。

你可能感兴趣的:(赋值与复制)