Ответ 1
Изменить 2
Проведя еще некоторое время с KVO, я обнаружил, что в вашем случае вы должны наблюдать person.workplace.address
вместо workplace.address
. Когда вы наблюдаете person.workplace.address
, вы достигаете двух вещей:
1) Поскольку у вас есть объект person
, у вас есть абсолютный контроль над жизненным циклом вашего объекта. Теперь вы можете удалитьObserver по своему усмотрению.
2) Когда объект workplace
изменен, механизм KVO будет "автоматически" наблюдать новый address
нового workplace
. Конечно, он уведомит вас о новом address
.
Теперь вы можете наблюдать address
, не опасаясь, что workplace
заменяется в произвольное время. Это одна из истинных скрытых возможностей KVO. Это позволяет подклассам безопасно наблюдать любые объекты суперкласса, не зная об их жизненных циклах.
Изменить 1
Лучшая практика удаления объекта в качестве наблюдателя для некоторого свойства KVO
Принятый ответ в этой теме лучше всего описывает вашу ситуацию. Вам не следует в первую очередь наблюдать свойство address
, так как вы не контролируете жизненный цикл workplace
. У вас проблемы с дизайном.
Оригинал
Вы можете наблюдать keyPath workplace
на объекте person. Когда этот keyPath вызывается, вы просто удаляетеObserver для workplace.address
.
[человек addObserver: theObserver forKeyPath: @ "рабочее место" Варианты: [NSKeyValueObservingOptionNew] Контекст: NULL];