我正在寻求实现NSMutableCopying
接口,因为我有一组不可变的对象,但我还需要能够创建修改后的副本。让我们假设我们有一部电影被定义为这样的(当然,真的会有更多的属性):
// BBMovie.h
@interface BBMovie : NSObject < NSCopying, NSMutableCopying >
@property(readonly, nonatomic, copy) NSString *title;
@end
@interface BBMutableMovie : BBMovie
@property(readwrite, nonatomic, copy) NSString *title;
@end
根据我的阅读,如果你需要在构造函数之外设置ivars,我将在这里实现NSCopying
,那么为它们定义私有setter是一个好习惯。所以我最终得到了BBMovie
这样的实现(注意这些类型不是为了允许子类化):
// BBMovie.m (note: compiling with ARC)
@interface BBMovie ()
@property(readwrite, nonatomic, copy) NSString *title;
@end
@implementation BBMovie
@synthesize title = _title;
- (id)copyWithZone:(NSZone *)zone
{
BBMovie *copy = [[BBMovie allocWithZone:zone] init];
if (copy) copy.title = self.title;
return copy;
}
- (id)mutableCopyWithZone:(NSZone *)zone
{
BBMutableMovie *copy = [[BBMutableMovie allocWithZone:zone] init];
if (copy) copy.title = self.title;
return copy;
}
@end
现在,鉴于我知道BBMovie
实现同时具有属性的getter和setter,看起来我应该能够像以下一样实现BBMutableMovie
:
@implementation BBMutableMovie
@dynamic title;
@end
这种方法有什么问题,和/或我错过了什么?
当然我意识到BBMovie实现并不是真正不可变的,因为如果库的消费者发送它会响应设置消息,但这并不是我真正关心的问题,因为它没有提供安全性风险并超出图书馆的“正常”使用范围。