- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个 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
属性解决此问题。
最佳答案
我发现这种情况下特别需要的任何类型的代码都没有必要,因为可以自动删除。
随着 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/
我正在做一个项目,我的 android 在这个项目中作为一个网络服务器工作;输入带端口号的 IP 地址,打开 Web 界面,用户可以将文件上传到手机。我想在 Web 界面上显示一些图片,以便我们的界面
我是一名优秀的程序员,十分优秀!