2

这是一个多部分的问题,主要是因为我对此事的无知是多层次的。

首先,我组装了一个用于缓存CGImageRef对象的缓存系统。当我在后台线程中加载图像时,我将其保持在CGImageRef水平(而不是)。UIImage加载图像后,我将其放入NSMutableDictionary. 我不得不做一些手臂扭转才能CGImageRef进入数组:

//Bunch of stuff drawing into a context
CGImageRef imageRef = CGBitmapContextCreateImage(context);

CGContextRelease(context); 
[(id)imageRef autorelease];
[self.cache setObject:(id)imageRef forKey:@"SomeKey"];

因此,如您所见,我试图将 Image Ref 视为NSObject,将其设置为 autorelease 然后将其放入字典中。我的期望是这将允许从字典中删除图像后进行清理。现在,我开始怀疑了。

当用户“重新启动”以播放不同的图像时,我的应用程序会清除缓存数组。在 Instruments 中运行应用程序表明,内存在重新启动时并没有回落到“开始”级别,而是保持稳定。我的直觉告诉我,当数组删除了所有对象时,CGImageRef并没有被清除。

但是,我无法确认这一点,因为我不太清楚如何追踪仪器中内存的实际来源。它只是一个(Malloc 16 字节、Malloc 32 字节等)的列表,钻入它们只会显示 dyld 调用者的列表。不知道如何正确阅读它。

那么,第一个问题,我缓存CGImageRef对象的方式是否完全有缺陷?有没有更好的方法来确认仪器中的这些东西?

4

2 回答 2

1

首先,缓存 CGImages 是可以的,我没有看到您发布的代码有任何问题。

我是否正确地假设您使用 anNSMutableDictionary作为缓存?如果是这样,您可以通过发送它来清除它-removeAllObjects,这应该释放所有键和值。如果您只是为相同的键设置不同的图像,内存使用量可能会保持大致相同,因为您将以前的图像替换为新的图像。如果图像具有相同的大小,则内存使用量应该保持不变,除非您在创建一批新图像时出现短暂的峰值。

至于 Instruments,我已经看到它既报告误报又错过了真正的泄漏。尝试运行它几次,如果可能的话,暂停一下,让 Leaks 仪器“赶上”。这听起来很疯狂,但我认为它可能会使它更可靠一些。

如果一切都失败了,您可以在加载一组图像之前和之后记录缓存的内容,以确保缓存本身按预期工作。

于 2010-12-20T16:22:05.493 回答
0

为什么不只缓存 UIImage 对象;您可以在后台线程上使它们正常吗?

您必须更加小心的是 UIImageView 对象,甚至它们对于后台的大多数操作都是可以的。

于 2010-12-20T15:49:08.060 回答