КВО говорит, что наблюдатель КВО зарегистрирован, хотя это не так (или это?) - PullRequest
0 голосов
/ 29 апреля 2010

Когда мое приложение закрыто, основной класс контроллеров удаляет себя как Observer из модели и затем выпускает модель. Как это:

- (void)dealloc {
    [theModel removeObserver:self
                  forKeyPath:@"myValue"];
    [theModel release];
    [super dealloc];
}

И сразу после этого отладчик говорит:

2010-04-29 14: 07: 40.294 MyProgram [13678: a0f] Экземпляр 0x116f2e880 класса TheModel был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы в нем. Информация наблюдений была утечка, и даже может быть ошибочно привязана к какому-либо другому объекту. Установите точку останова на NSKVODeallocateBreak, чтобы остановиться здесь в отладчике. Вот текущая информация наблюдения:
(
Контекст: 0x0, Свойство: 0x116f80430>
) * +1010 *

где 0x116f2e880 действительно модель, а 0x116f40ec0 действительно контроллер.

Как контроллер все еще может быть наблюдателем, если он только что удалился в качестве наблюдателя?

1 Ответ

2 голосов
/ 30 апреля 2010

Это всего лишь предположение, но вы добавляли контроллер в качестве наблюдателя для этого ключевого пути более одного раза? Возможно, с другими вариантами или контекстом? Или вы добавили его в качестве наблюдателя к другому объекту, но с ключевым путем, который разрешается к объекту модели? например если у foo есть свойство theModel и вы добавили контроллер в качестве наблюдателя для foo с путем ключа "theModel.myValue".

Не могли бы вы поставить точку останова на -addObserver:forKeyPath:options:context: и посмотреть, что и когда будет добавлено?

...