这是实现NSMutableCopying的合理模式吗?

时间:2012-07-04 13:08:13

标签: objective-c nscopying nsmutablecopying

我正在寻求实现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实现并不是真正不可变的,因为如果库的消费者发送它会响应设置消息,但这并不是我真正关心的问题,因为它没有提供安全性风险并超出图书馆的“正常”使用范围。

0 个答案:

没有答案