我正在将我的项目转换为使用ARC的过程中,遇到了一个特殊的问题。我有一个管理从网络下载的文件缓存的类。每个文件都存储在iPhone文件系统中,并且在我的管理器类中为它保留了一个相关的对象。其他想要使用文件的对象,向我的管理器请求一个缓存对象,并将其保留到需要该文件的时间。
但有时,管理器会清理缓存,删除旧文件。当然,它不应该删除当时正在使用的文件。在启动之前,我通过使用相关对象的retainCount检测到了这一点:
// if retainCount is 1 then only the cache has a reference to it
if( obj.retainCount <= 1 ) {
[obj deleteFile];
[cache removeObject:obj];
}这工作得很好,是的,我知道关于retainCount不可靠性的警告,但根据我的经验,如果retainCount >1,您肯定知道有不止一个对象保留了它
然而,在ARC中,你不能再使用retainCount了。我可以引入自己的保留计数机制,并要求所有使用文件的对象显式地保留和释放文件对象。但这很容易出错,这正是ARC应该解决的事情。
你有没有更好的方法来实现同样的目标?
发布于 2012-03-03 01:39:29
此功能最好由NSCache和NSDiscardableContent处理。这使用了显式的start和end调用,这允许您维护对不一定需要保留的内容的强引用(因为您将自动重新创建它们)。使用NSCache还可以获得其他好处,例如即使在挂起时也可以自动转储可丢弃的内容。如果没有像NSCache这样的东西,你会在内存不足时被杀死,而不是让你倾倒多余的缓存。
也就是说,您已经构建了另一个系统。这个特殊的问题就是weak引用的用途。缓存应该维护对对象的弱引用,而不是强引用。在Non-retaining array for delegates中讨论了几种方法。我个人更喜欢NSValue解决方案。得到认可的答案听起来很简单,但你需要很好地理解ARC和CFArray才能正确使用它。NSValue解决方案要简单得多。
理想情况下,如果您的文件对象知道它们被缓存了,它们可以告诉缓存在它们的dealloc期间删除它们。否则,您可以定期从数组中清除空值。
发布于 2012-03-03 01:17:55
只需在对象的实现中设置一些int变量,在每次保留对象时递增它,并覆盖它的dealloc方法来递减它。保留计数相同,但它只适用于自定义对象。
发布于 2012-11-13 05:32:20
不确定这是否适用于您的需求,但是您知道Associative References吗?这些选项允许您将从属对象附加到主对象,以便从属对象在主对象存在的过程中一直存在。这样不仅可以将对象附加到您无法控制的对象,而且还可以了解它们的生命周期结束情况。
我想知道您是否可以使用它通过附加一个自定义类对象来监视您的"obj“,如果"obj”被释放,该自定义类的dealloc将被调用。在自定义取消分配中,您可以执行文件删除。
https://stackoverflow.com/questions/9537432
复制相似问题