Ответ 1
Жесткий вызов, ИМХО оба варианта сосут.
Первый заставляет вас писать собственный сеттер, в котором много шаблонов. (Не говоря уже о том, что вы должны помнить, чтобы также отключать уведомления KVO с willChangeValueForKey:
и didChangeValueForKey:
, если вы хотите, чтобы KVO для рассматриваемого свойства работал.)
Второй вариант также довольно тяжелый, и вашей реализации недостаточно. Что делать, если ваш суперкласс также имеет некоторые KVO? Вы должны вызвать super
где-нибудь в обработчике. Если нет, вы уверены, что ваш суперкласс не изменится? (Подробнее о KVO в связанном вопросе.)
Иногда вы можете обойти проблему, используя другие методы, такие как привязки (если вы на Mac) или обычные уведомления (вы можете опубликовать уведомление о том, что модель изменилась, и все заинтересованные стороны должны обновиться).
Если у вас много перерасчетов, подобных этому, и не могу найти лучшего способа, я бы попытался написать суперкласс с лучшей поддержкой наблюдения, с таким интерфейсом:
[self addTriggerForKeyPath:@"foo" action:^{
NSLog(@"Foo changed.");
}];
Это потребует больше работы, но оно будет тщательно разделять ваши классы, и вы сможете решить все проблемы, связанные с KVO, на одном месте. Если для этого не достаточно повторно рассчитанных свойств, я обычно использую первое решение (настраиваемый сеттер).