【发布时间】:2011-05-16 11:52:03
【问题描述】:
我的应用程序以特定顺序从 URL 下载图像,然后用户查看它们。我让应用程序预加载下一张图片并将旧图片保存在缓存中。
这个缓存基本上是一个 NSMutableDictionary,其中的键与图像 ID 相关联。缓存中的每个对象也是一个带有 url、图像 URL、标题和 NSData 对象的 NSDictionary。当我下载图像时,我将一个新的字典对象添加到带有这些元素的缓存中。我像这样存储 NSData 对象: NSData *imgData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageurl]];然后我将此对象添加到子字典对象中。
这显然在存储和缓存大量照片后会占用大量RAM,因此我通过清除整个缓存来响应内存警告。问题是,无论我尝试了什么,都没有释放 RAM。对象消失(就像它们应该消失的那样),但不要归还 RAM。我尝试过以下操作:
- 循环缓存字典,释放子字典中的数据对象,然后当所有项都循环通过时,移除所有缓存字典子对象。
- 循环缓存字典,释放子字典,完成后删除所有对象
- 即使删除所有对象,然后释放整个缓存对象(然后重新创建它,因为它仍然需要使用)
- 以及其他随机释放、移除等组合。
问题是,我没有尝试释放内存。释放 NSData 对象的内存时我做错了什么吗?
【问题讨论】:
-
下载数据时使用什么缓存策略?您是否确认(即通过 Leaks 或 Allocations)内存肯定被泄漏或放弃了?
-
我实际上并没有使用任何内置于 iOS SDK 中的缓存——我正在使用一个充满 NSData 对象(包含图像)的 NSDictionary 来管理我自己的缓存。每当我从字典中删除所有对象时,都不会释放内存。我不确定这个内存到底分配在哪里,但它并没有像我想要的那样被释放。
标签: iphone objective-c memory nsdictionary nsdata