首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动参考计数(ARC)和retainCount

自动参考计数(ARC)和retainCount
EN

Stack Overflow用户
提问于 2012-03-03 01:09:30
回答 3查看 2.6K关注 0票数 2

我正在将我的项目转换为使用ARC的过程中,遇到了一个特殊的问题。我有一个管理从网络下载的文件缓存的类。每个文件都存储在iPhone文件系统中,并且在我的管理器类中为它保留了一个相关的对象。其他想要使用文件的对象,向我的管理器请求一个缓存对象,并将其保留到需要该文件的时间。

但有时,管理器会清理缓存,删除旧文件。当然,它不应该删除当时正在使用的文件。在启动之前,我通过使用相关对象的retainCount检测到了这一点:

代码语言:javascript
复制
// 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应该解决的事情。

你有没有更好的方法来实现同样的目标?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-03 01:39:29

此功能最好由NSCacheNSDiscardableContent处理。这使用了显式的startend调用,这允许您维护对不一定需要保留的内容的强引用(因为您将自动重新创建它们)。使用NSCache还可以获得其他好处,例如即使在挂起时也可以自动转储可丢弃的内容。如果没有像NSCache这样的东西,你会在内存不足时被杀死,而不是让你倾倒多余的缓存。

也就是说,您已经构建了另一个系统。这个特殊的问题就是weak引用的用途。缓存应该维护对对象的弱引用,而不是强引用。在Non-retaining array for delegates中讨论了几种方法。我个人更喜欢NSValue解决方案。得到认可的答案听起来很简单,但你需要很好地理解ARC和CFArray才能正确使用它。NSValue解决方案要简单得多。

理想情况下,如果您的文件对象知道它们被缓存了,它们可以告诉缓存在它们的dealloc期间删除它们。否则,您可以定期从数组中清除空值。

票数 5
EN

Stack Overflow用户

发布于 2012-03-03 01:17:55

只需在对象的实现中设置一些int变量,在每次保留对象时递增它,并覆盖它的dealloc方法来递减它。保留计数相同,但它只适用于自定义对象。

票数 0
EN

Stack Overflow用户

发布于 2012-11-13 05:32:20

不确定这是否适用于您的需求,但是您知道Associative References吗?这些选项允许您将从属对象附加到主对象,以便从属对象在主对象存在的过程中一直存在。这样不仅可以将对象附加到您无法控制的对象,而且还可以了解它们的生命周期结束情况。

我想知道您是否可以使用它通过附加一个自定义类对象来监视您的"obj“,如果"obj”被释放,该自定义类的dealloc将被调用。在自定义取消分配中,您可以执行文件删除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9537432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档