2

我正在寻找实现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 实现并不是真正不可变的,因为如果库的消费者发送它会响应设置的消息,但这对我来说并不是真正的问题,因为它不会带来安全风险并且会下降在图书馆的“正常”使用之外。

4

0 回答 0