Наблюдение информация была утечка - PullRequest
3 голосов
/ 28 февраля 2012

У меня есть класс, и я использую его в качестве наблюдателя. Мне нужно, чтобы уведомить меня, когда другие объекты меняют свои свойства. Когда он освобождается, я не убираю наблюдателя. Однако я получаю ошибки, подобные этой:

An instance 0xf819680 of class **** was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object. Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. Here's the current observation info:

Теперь я не понимаю, почему это может быть проблемой. Насколько я понимаю, КВО состоит в том, что если объект A хочет наблюдать объект B, то A сохраняет B, а затем

[B addObserver:A];  // shortened just to get the point across

и B НЕ сохраняют A, чтобы избежать цикла. Следовательно, если A освобождается, он должен удалить себя в качестве наблюдателя B, иначе B не будет иметь ссылки на то место, где раньше находился A (поскольку он NOT сохранил A).

Однако это предупреждение, по-видимому, подразумевает, что, если я освобожу B, случится что-то плохое. Единственное, что я могу себе представить, это то, что слабая ссылка на A, которую имеет B, исчезнет, ​​и A просто не получит больше уведомлений. Я не знаю, как «информация наблюдений была просочилась». Если B уходит, почему информация о наблюдениях, которую он хранил, не уходит?

1 Ответ

3 голосов
/ 29 февраля 2012

На самом деле я сам нашел ответ на этот вопрос.Кажется, что когда вы освобождаете B, это не освобождает информацию наблюдения.Это связано с тем, что KVO реализуется по категориям (которые не могут добавлять дополнительные данные к самому объекту), поэтому данные должны храниться где-то централизованно с помощью инфраструктуры KVO.

В соответствии с документацией для addObserver:

Neither the receiver, nor anObserver, are retained.

Поэтому, когда вы освобождаете, среда KVO не знает, что указатель на B (который он использует для вычисления уведомлений) равеннедействительным.Следовательно, если в том же пространстве памяти окажется другой объект, он станет наблюдаемым объектом и потенциально отправит нежелательные уведомления.

...