Когда мне следует вызывать removeObserver: forKeyPath из закрывающего класса ViewController, который наблюдает за постоянным классом Model? - PullRequest
5 голосов
/ 02 февраля 2012

У меня есть класс ViewController, у которого есть свойство, которое является моделью, которую я хочу наблюдать при изменении свойств модели.В моем объекте модели у меня есть свойство, которое периодически обновляется в фоновом режиме моего приложения.Когда он обновляется, мне нужно выполнить код внутри моего ViewController.

. Для этого я создаю наблюдателя на моей модели из моего ViewController viewDidLoad метода.

[ModelObject addObserver:self 
              forKeyPath:@"State" 
                 options:NSKeyValueObservingOptionNew 
                 context:nil];

Как видите, в этом нет ничего особенного, и метод наблюдения ведет себя так, как и должен, пока я оставляю вид, отображаемый на моем экране.Если я удаляю вышеуказанное представление из родительского представления, я получаю сообщение об ошибке EXC_BAD_ACCESS, когда изменяется мое свойство ModelObject instance Mode.В частности, мое приложение аварийно завершает работу на строке, обновляющей свойство Mode, и я получаю бесполезный EXC_BAD_ACCESS в следующей строке кода в экземпляре ModelObject.

//This is located in a method that periodically toggles the value of "State"
[self setState: 2];

Я бы предположил, что решениек этой проблеме относится вызов [ModelObject removeObserver: self forKeyPath:@"State"] откуда-то из моего ViewController, когда он удаляется из родительского массива подпредставления.Тем не менее, я добавил эту строку кода в мой метод viewDidUnload, но обнаружил, что метод viewDidUnload не вызывается.Я не уверен, что это правильное место, но куда-то нужно идти.

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

Ответы [ 2 ]

9 голосов
/ 02 февраля 2012

Я обычно люблю ставить addObserver: и removeObserver: в viewWillAppear: и viewWillDisappear:. Я считаю, что это более надежные форзацы, чем viewDidLoad и viewDidUnload.

1 голос
/ 02 февраля 2012

Вы должны удалить его в -dealloc * 1001 контроллера вида

...