Сделайте необходимо назвать willChangeValueForKey: и didChangeValueForKey:?

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

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

  // Safeguards 
  // ...

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

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

-(void) setFoo(Foo *)newFoo {

  // Safeguards 
  // ...

  // Switcheroo
  // ...
}

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

9
задан Chris Hanson 19 July 2010 в 06:03
поделиться

1 ответ

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

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

13
ответ дан 4 December 2019 в 15:11
поделиться