我看了其他一些关于这个话题的讨论,但是我还是不明白。
我想创建两种对象,一种是只有“readonly”属性的不可变对象,另一种是只有“readwrite”属性的可变对象。
我们称它们为EXCar和EXMutableCar。
EXCar是NSObject的子类,而EXMutableCar是EXCar的子类。
ExCar的接口中将会有:
@property (nonatomic, strong, readonly) NSString *name;
EXMutableCar将在其接口中拥有
@property (nonatomic, strong) NSString *name;
当我使用其子类EXMutableCar时,我会“打开”EXCar的属性。然后它是可变的。问题是在它们之间正确地进行复制。
我在EXCar中实现了mutableCopyWithZone方法:
- (id)mutableCopyWithZone:(NSZone *)zone {
EXMutableCar *mutableCopy = [[EXMutableCar allocWithZone:zone] init];
mutableCopy.name = _name;
return mutableCopy;
}
第一个问题,这样做是好的吗?(我想要完全复制)
问题在于copyWithZone。 由于EXCar的属性是只读的,我既不能在EXCar中创建新实例,也不能在EXMutableCar中创建新实例并像这样填充它的属性:
- (id)copyWithZone:(NSZone *)zone {
EXCar *copy = [[EXCar allocWithZone:zone] init];
copy.name = _name; // This can't work...
return copy;
}
我不想写一个有15个属性需要传入的“init”方法(当然,EXCar只是一个例子,真实的类中通常有很多属性)。通常它们是从服务器的JSON消息中初始化的,所以它们不需要复杂的init方法。
第二个问题是如何编写一个copyWithZone方法来保持我的类是不可变的?
谢谢您的帮助 :)