Как удалить KVO из слабого свойства?

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

A переживает B, поскольку контроллер представления имеет сильную ссылку на A. Вот сообщение об утечке журнала:

An instance 0x9ac5200 of class UITableView 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:
 (
 Context: 0x8660020, Property: 0x864ac80>
)

B — это UITableView. Установка точки останова на NSKVODeallocateBreakдает бесполезные результаты.

В A's removeFromSuperviewя пытаюсь удалить наблюдателя, но ссылка А на B уже равна нулю.

Переключение на unsafe_unretainedи выполнение задач вручную или вызов [A removeFromSuperview]в dealloc контроллера представления решает проблему. Я хотел бы знать, как решить эту проблему, используя свойство weak.

Вот соответствующий код: https://gist.github.com/2822776

35
задан Kazuki Sakamoto 16 June 2012 в 01:38
поделиться