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

私が読んだことから、ここで実装するように、コンストラクターの外部で 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 の実装は、ライブラリのコンシューマによって送信された場合に設定されたメッセージに応答するため、真に不変ではないことは理解していますが、セキュリティ リスクを示さず、ライブラリの「通常」の使用範囲外。

4

0 に答える 0