【问题标题】:If I CFRelease() an image in core data, how do I get it back?如果我 CFRelease() 核心数据中的图像,我该如何取回它?
【发布时间】:2011-03-03 07:34:40
【问题描述】:

我的 iphone 应用播放由 5 个用户图像组成的幻灯片。这些图像是使用核心数据存储的。我注意到每次播放不同的幻灯片时内存都会增加,并且不会释放任何以前播放的幻灯片。 这些图像在对象分配中显示为 CFData。所以我尝试在dealloc方法中释放这些数据

CFRelease(slideshow.image1);
CFRelease(slideshow.image2);
CFRelease(slideshow.image3);
CFRelease(slideshow.image4);
CFRelease(slideshow.image5);

这很好地释放了以前的幻灯片...但是当我再次返回查看相同的幻灯片时,它崩溃了。 我猜我需要再次分配/初始化这些图像,但我不确定如何?或者也许我应该以不同的方式管理这段记忆?

【问题讨论】:

    标签: iphone memory-management core-data


    【解决方案1】:

    听起来你是 CFRelease-ing 数据,你不应该,因为你在乱搞 NSManagedObject,当核心数据“WTF?”时,你不可避免地会崩溃?

    通过“它没有释放”,您看到的是内存泄漏,还是简单的内存使用增长?如果是前者,那么我们将需要更多信息,尤其是如果 Core Data 泄漏,您可能需要提交错误报告(这不太可能)。如果是后者,那么您可以做很多事情,因为 Core Data 负责自己的内存管理。

    您可以使用NSAutoreleasePool 进行优化,但我不能说更多。

    【讨论】:

    • 这只是内存使用量的增长。我无法找到任何内存泄漏,但我一直在崩溃。然而,崩溃似乎只是在大量使用后才会发生。所以我的想法是记忆的积累导致了不稳定。崩溃通常发生在编辑图像时。在反复使用相机和图像选择器之后。
    • 内存使用量增加并不一定表明存在问题。如果您使用 Leaks 运行您的应用程序并没有发现任何东西(尤其是在设备上进行测试时),那么您可能没有任何泄漏。
    • 有没有办法在我调用 CFRelease 后重新分配这些 NSManagedObjects?我对 Apple 文档不太了解。
    • 我不知道如何回答这个问题。为什么要分配 NSManagedObjects?我主要将 CoreData 与 NSFetchedResultsController 结合使用来获取现有数据;我使用 NSManagedObjectContext 插入新实体并使用 deleteObject 摆脱它们。我自己从不明确分配 NSManagedObjects。您需要从头开始——确切地确定您需要什么(而不是如何),然后弄清楚如何去做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多