我有一个视图(我们称之为视图 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:
<NSKeyValueObservationInfo 0x8660360> (
<NSKeyValueObservance 0x8660320: Observer: 0x8660020, Key path: contentOffset, Options: <New: YES, Old: NO, Prior: NO> Context: 0x8660020, Property: 0x864ac80>
)
B 是一个 UITableView。在处设置断点会NSKVODeallocateBreak
产生无用的结果。
在 A'sremoveFromSuperview
中,我尝试删除观察者,但 A 对 B 的引用已经是nil
。
切换到unsafe_unretained
更多手动操作或调用[A removeFromSuperview]
视图控制器dealloc
可以解决问题。我想知道如何使用weak
属性来解决这个问题。
以下是相关代码:https ://gist.github.com/2822776