这是一个多部分的问题,主要是因为我对这个问题的无知有多个层次。
首先,我构建了一个用于缓存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,将其设置为自动释放,然后将其放入字典中。我的期望是,这将允许图像在从字典中删除后被清理。现在,我开始怀疑了。
当用户“重启”播放不同的图像时,我的应用程序会清除缓存数组。在Instruments中运行应用程序显示,内存在重新启动时不会降回"start“级别,而是保持稳定。我的直觉告诉我,当数组删除了所有对象时,CGImageRef并没有被清除。
然而,我无法证实这一点,因为我不太知道如何追踪仪器中内存的实际来源。这只是一个列表(Malloc 16字节,Malloc 32字节,等等),深入它们只显示dyld调用者的列表。不确定如何正确地阅读它。
那么,第一个问题是,我缓存CGImageRef对象的方式是完全有缺陷的吗?有没有更好的方法在仪器中确认这些事情?
发布于 2010-12-21 00:22:05
首先,缓存CGImages是可以的,我看不出您发布的代码有任何问题。
我假设您使用NSMutableDictionary作为缓存,对吗?如果是这样,您可以通过向它发送-removeAllObjects来清除它,这将释放所有的键和值。如果只是为相同的关键点设置不同的图像,内存使用量可能会大致保持不变,因为您需要用新图像替换以前的图像。如果图像具有相同的大小,则在创建新的一批图像时,除了短暂的峰值外,内存使用量应该是恒定的。
至于Instruments,我看到它既报告了假阳性,也错过了真正的泄漏。试着运行它几次,如果可能的话,暂停一下,让泄漏仪器“赶上”。这听起来很疯狂,但我认为这可能会让它更可靠一些。
如果所有其他方法都失败了,您可以在加载一组图像之前和之后记录缓存的内容,以确保缓存本身按预期工作。
发布于 2010-12-20 23:49:08
为什么不只缓存UIImage对象;可以在后台线程上使它们更好?
您必须更加小心地使用UIImageView对象,即使它们对于后台的大多数操作也是可以的。
https://stackoverflow.com/questions/4490674
复制相似问题