fis*_*ear 2 cocoa-touch objective-c retaincount ios5 automatic-ref-counting
我正在将我的项目转换为使用ARC,并遇到了一个特殊问题.我有一个类来管理从网络下载的文件缓存.每个文件都存储在iPhone文件系统中,相关对象保存在我的管理器类中.其他想要使用文件的对象,请求我的经理获取缓存对象,并在需要该文件时保留该文件.
但偶尔,经理会清理缓存,删除旧文件.当然,它不应该删除当时正在使用的文件.在ARC之前,我通过使用关联对象的retainCount检测到:
// if retainCount is 1 then only the cache has a reference to it
if( obj.retainCount <= 1 ) {
[obj deleteFile];
[cache removeObject:obj];
}
Run Code Online (Sandbox Code Playgroud)
这完全有效[是的,我知道有关retainCount不可靠的警告,但根据我的经验,如果retainCount> 1,你肯定知道不止一个对象保留了它]
但是,使用ARC时,不允许再使用retainCount.我可以引入自己的保留计数机制,并要求所有使用文件的对象明确保留和释放文件对象.但那是错误的,而且这正是ARC应该解决的问题.
你知道更好的方法来实现同样的目标吗?
此功能最好由NSCache和处理NSDiscardableContent.这使用显式start和end调用,允许您保持对不一定需要保留的事物的强引用(因为您将自动重新创建它们).使用NSCache此功能还可以获得其他优势,例如即使您被暂停也可以自动转储可丢弃内容.没有类似的东西NSCache,当内存变低而不是让你转储多余的缓存时,你会被杀死.
也就是说,你已经构建了另一个系统.这个特殊问题是weak参考资料的用途.您的缓存应该保持对对象的弱引用,而不是强引用.在代表的非保留数组中讨论了几种方法.我个人更喜欢这个NSValue解决方案 批准的答案听起来很简单,但你需要理解ARC,CFArray并且要正确使用它.该NSValue解决方案是棘手的要少得多.
理想情况下,如果您的文件对象知道它们已被缓存,它们可以告诉缓存在它们期间删除它们dealloc.否则,您可以定期清除阵列中的空值.
| 归档时间: |
|
| 查看次数: |
2610 次 |
| 最近记录: |