Я думал, что приготовленные в домашних условиях @property методы set, как предполагалось, были похожи на это:
-(void) setFoo:(Foo *)newFoo {
// Safeguards
// ...
[self willChangeValueForKey:@"foo"];
// Switcheroo
// ...
[self didChangeValueForKey:@"foo"];
}
Но я вижу много кода в сообщениях в блоге людьми, которые делали Какао намного дольше, чем я имею, где это похоже на это:
-(void) setFoo(Foo *)newFoo {
// Safeguards
// ...
// Switcheroo
// ...
}
Таким образом, мой вопрос, мы должны назвать методы KVO-уведомления? Или это сделало волшебно при обновлении частного iVar при использовании современного времени выполнения?
Это происходит волшебным образом, если вы не откажетесь. прочтите этот раздел руководства KVO. Обратите внимание, что KVC / KVO существовали с незапамятных времен (то есть до введения @property
), поэтому не имеет значения, установлен ли установщик @synthesize
d или нет. Это даже не связано с дихотомией старого и нового времени выполнения.
Подробности этой магии (isa-swizzling) подробно описаны в сообщении блога Майка Эша. Это магия. По сути, при обнаружении ключа среда выполнения автоматически заменяет реализацию установщика так, чтобы она вызывала уведомление KVO.