说一个基础问题
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:(后补)
真的觉得挺麻烦,于是自己尝试封装了一个工具类。
地址://www.greatytc.com/p/3355936f37a3
如此一来,想实现题干需求,只需要
Person *p1 = [Person new];
p1.age = 1;
Person *p2 = [p1 autoCopy];
Person *p3 = [p1 autoCopy];
p2.age = 2;
p3.age = 3;
即可。