Вам нужно вызвать willChangeValueForKey: и didChangeValueForKey :? - PullRequest
9 голосов
/ 16 июля 2010

Я думал, что домашние сеттеры @property должны были выглядеть так:

-(void) setFoo:(Foo *)newFoo {

  // Safeguards 
  // ...

  [self willChangeValueForKey:@"foo"];
  // Switcheroo
  // ...
  [self didChangeValueForKey:@"foo"];
}

Но я вижу много кода в постах людей, которые делают Какао намного дольше, чем я, где это так:

-(void) setFoo(Foo *)newFoo {

  // Safeguards 
  // ...

  // Switcheroo
  // ...
}

Итак, мой вопрос: нужно ли нам вызывать методы уведомления KVO? Или это происходит волшебным образом при обновлении частного iVar, если вы используете современную среду выполнения?

1 Ответ

13 голосов
/ 16 июля 2010

Это сделано волшебным образом, если вы не отказываетесь. прочитайте этот раздел руководства KVO. Обратите внимание, что KVC / KVO существовал с незапамятных времен (то есть до введения @property), поэтому не имеет значения, является ли установщик @synthesize d или нет. Это даже не связано со старой / новой дихотомией времени выполнения.

Подробно об этом волшебстве (изящество Иса) было подробно описано в блоге Майка Эша. Это магия. По сути, когда наблюдается ключ, среда выполнения автоматически заменяет реализацию установщика, вызывая уведомление KVO.

...