У меня есть представление (назовем это представление 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