Значение ключа Наблюдайте removeObserver, когда наблюдаемый объект освобожден - PullRequest
6 голосов
/ 31 января 2012

Существуют различные вопросы, связанные с этой темой, но ни один из них не отвечает на мой вопрос.

Я хочу removeObserver от объекта, когда этот объект освобождается.Я использую KVO, поскольку необходимо наблюдать за несколькими объектами, и NSNotification имеет огромные накладные расходы в этом случае.

Вот сценарий:

(несколько) Объекты наблюдаются различными другимиобъекты.Когда observer будет освобожден, я могу удалить его в качестве наблюдателя.Но когда observed освобождают, мне нужно сказать всем observers, чтобы они удалились как наблюдатели.Как это сделать?

Ответы [ 3 ]

3 голосов
/ 31 января 2012

Sailesh, если объект (наблюдаемый) будет освобожден, тогда этот объект не может быть изменен или его значение не может быть изменено, поэтому, если ваши наблюдатели наблюдают за освобожденным объектом, и этот освобожденный объект никогда не отправит никакого уведомления о наблюдении тогда есть ли удовольствие от удаления наблюдателей ???
~~~~~~~~~~~~~~~~~~~~~ Edited ~~~~~~~~~~~~~~~~~~~~~~~~
эй, я получил кое-что от здесь . Идея состоит в том, что вы наблюдаете дополнительное свойство, скажем alive, и записываете в dealloc из наблюдаемых как alive = NO;, и когда это свойство изменяется, все наблюдатели будут получать уведомления, и, таким образом, вы можете удалить всех наблюдателей.


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~

2 голосов
/ 31 января 2012

Я думаю, здесь есть проблема дизайна. Наблюдаемый объект не должен заботиться о его наблюдателях. Вы говорите, что хотите удалить наблюдателей из метода наблюдаемых объектов dealloc. Но почему это освобождается? Если это все еще наблюдается, где-то есть собственность, таким образом, объект не будет освобожден. Хороший дизайн приводит к тому, что к моменту вызова dealloc не осталось ни одного наблюдателя.

Представьте себе вид, который регистрируется как наблюдатель за модельным объектом. Этот объект модели либо сохраняется в виде, либо в контроллере. Модельный объект не будет называть его деаллок, если он где-то хранится. Только когда последний владелец освобожден, он должен вызвать dealloc. Так, скажем, все права собственности освобождены, кроме view / viewcontroller и остался один наблюдатель (view). Теперь, прежде чем view / viewcontroller освободит свое владение объектом модели, он также должен удалить представление в качестве наблюдателя. Таким образом, к тому времени, когда вызывается метод dealloc, наблюдателя не должно быть.

1 голос
/ 31 января 2012

Вы можете отдельно опубликовать уведомление от -(void)dealloc, когда наблюдаете, как его освободили.при получении всех остальных наблюдателей удалит необходимое уведомление.

...