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