objective-c - 如何从弱属性中移除 KVO?

标签 objective-c ios macos automatic-ref-counting

我有一个 View (我们称之为 View A),它的父 View ( View B)有一个 weak 属性。查看 A KVO 的父 View , View B。由于 View A 对 View B 的引用是弱属性(以防止保留循环),我如何删除观察者(A 观察 B)?在我有机会删除它之前, View A 对 View B 的引用被取消了。

A 比 B 长,因为 View Controller 对 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 的 removeFromSuperview 中,我尝试删除观察者,但 A 对 B 的引用已经是 nil

切换到 unsafe_unretained 并更多地手动执行操作或在 View Controller 的 dealloc 中调用 [A removeFromSuperview] 可以解决问题。不过,我想知道如何使用 weak 属性解决此问题。

相关代码如下:https://gist.github.com/2822776

最佳答案

我发现这种情况下特别需要的任何类型的代码都没有必要,因为可以自动删除。

随着 ARC 的引入,Apple 应该提供自动移除观察者的功能以解决此类问题,但不幸的是他们没有这样做。但是我创建了自己的类别,添加了这个缺少的功能:https://github.com/krzysztofzablocki/SFObservers 我已经在我的博客上解释了我是如何做到的:http://www.merowing.info/2012/03/automatic-removal-of-nsnotificationcenter-or-kvo-observers/

如果您查看我的解决方案,您会注意到,它确保调用原始代码,即使其中一个方法调用其他方法,这样即使 apple 更改其内部行为,该类别仍然可以正常工作:)

关于objective-c - 如何从弱属性中移除 KVO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10793206/

相关文章:

ios - 为 CocoaAsyncSocket 获取无效的 IPv4 地址创建 sockaddr_in

ios - 自定义 tableview 单元格的问题。自定义 tableview 单元格内的 Collectionview 未根据单元格的高度进行调整

ios - 信号量在我的案例中没有按预期工作

iphone - iOS 6 自动旋转问题 - 不遵守 supportedInterfaceOrientations 返回值

ios - 带扫描指示器的条形码阅读器

将在 Mac 上创建的 .c 文件转换为 Windows

objective-c - 设置 NSStatus 项的标题文本颜色

ios - UITableView 单元格未显示放置在自定义单元格上的 UITableView(KPDropDown)

objective-c - iOS 中静态常量变量的子类化问题

macos - 连接Qt与 cocoa