Это разумный шаблон для реализации 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тогда хорошей практикой будет определить для них частные сеттеры. Так что я бы в конечном итоге с реализацией, как это для 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 не является действительно неизменной, поскольку она будет реагировать на заданные сообщения, если она отправляется потребителями библиотеки, но это на самом деле меня не беспокоит, поскольку она не представляет угрозы безопасности и падает за пределами "нормального" использования библиотеки.

0 ответов

Другие вопросы по тегам