У меня есть представление (мы будем называть это представление A), которое имеет свойство weak
для своего супервизора (вид B). Просмотреть A KVO его супервизор, просмотреть B. С точки зрения Ссылка на вид B является слабым свойством (чтобы предотвратить цикл сохранения), как я могу удалить наблюдателя (наблюдение B)? Просмотр Ссылка на просмотр B получает nil'd, прежде чем у меня есть шанс удалить его.
Выходит 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 the current observation info:
<NSKeyValueObservationInfo 0x8660360> (
<NSKeyValueObservance 0x8660320: Observer: 0x8660020, Key path: contentOffset, Options: <New: YES, Old: NO, Prior: NO> Context: 0x8660020, Property: 0x864ac80>
)
B - это UITableView. Установка точки останова при NSKVODeallocateBreak
дает бесполезные результаты.
В A removeFromSuperview
я пытаюсь удалить наблюдателя, но ссылка на B уже nil
.
Переключение на unsafe_unretained
и делать что-то более вручную или вызов [A removeFromSuperview]
в контроллере представления dealloc
решает проблему. Я хотел бы знать, как решить эту проблему, используя свойство weak
.
Здесь соответствующий код: https://gist.github.com/2822776