Могут ли пользовательские сеттеры нарушить шаблон KVO?Разбить сохранить или скопировать шаблон? - PullRequest
0 голосов
/ 04 февраля 2012

В Objective-C мне интересно, переопределит ли пользовательский установщик поддержку KVO (willChangeValueForKey: и didChangeValueForKey;) и нужно ли явно включать вызовы для них в пользовательском установщике?

Как насчет сохраненияи копировать?Нужно ли явно включать выпуск и сохранение или копирование в установщик для свойств с атрибутами «Сохранять» или «Копировать» (для не-ARC-кода)?

Ответы [ 3 ]

5 голосов
/ 04 февраля 2012

KVO будет работать автоматически, если ваши средства доступа имеют стандартный формат (-setFoo: и -foo).Сохранение и копирование, однако, вам потребуется для управления собой в своих пользовательских средствах доступа.

Это связано с тем, что сохранение и копирование являются частью синтезированных средств доступа, тогда как KVO основывается исключительно на именах методов.Проверьте здесь для полного описания именования методов, совместимых с KVO.

2 голосов
/ 04 февраля 2012

Взгляните на Яблоки Расширенное программирование управления памятью , которое расскажет вам, как правильно реализовать ваши собственные методы получения / установки:

1 голос
/ 04 февраля 2012

Состояние документы :

Автоматическая поддержка предоставляется NSObject и по умолчанию доступна для всех свойств класса, которые кодируют значение ключа совместимый. Как правило, если вы следуете стандартному кодированию и наименованию какао соглашения, вы можете использовать автоматические уведомления об изменениях - у вас нет написать любой дополнительный код.

Если у вас есть сеттер, просто соблюдайте соглашения об именах.

Относительно копирования / сохранения:

- (void)setFoo:(id)bar {
  @synchronized (self) { // synchronize if you have to, can be omitted in most cases
    if (bar_ != bar) { // bar_ is the ivar
      [bar_ release]; // omit in ARC
      bar_ = [bar copy]; // resp. retain in other variant
    }
  }
}

Если ваш сеттер не соответствует линиям гильдии, загляните в раздел «Уведомление об изменении вручную».

...