不変のオブジェクトのセットがあるため、インターフェイスを実装しようとしてい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
私が読んだことから、ここで実装するように、コンストラクターの外部で ivar を設定する必要がある場合は、NSCopying
プライベート セッターを定義することをお勧めします。したがって、次のような実装になります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
に実装できるはずです。BBMutableMovie
@implementation BBMutableMovie
@dynamic title;
@end
このアプローチに問題はありますか、または何か不足していますか?
もちろん、BBMovie の実装は、ライブラリのコンシューマによって送信された場合に設定されたメッセージに応答するため、真に不変ではないことは理解していますが、セキュリティ リスクを示さず、ライブラリの「通常」の使用範囲外。