内存泄漏与高内存分配?

时间:2011-02-03 12:55:56

标签: iphone ios4 memory-leaks memory-management

在我的iPhone应用程序中,我有一个非常长的表,我从xml(在线xml)加载。此表显示一行中的一个图像和一些文本数据。我也使用Lazy Loading来加载图像。 现在在仪器中没有严重的泄漏,但是当我将表格向下滚动时总体内存分配增加(意味着加载新图像)。

我想知道这会导致应用程序崩溃吗?我的客户说该应用程序在3GS和iPhone 4上崩溃,我在iPod 4G上测试应用程序。我没有看到任何崩溃,但我可以在仪器中看到高内存分配。

请帮助!

更新 -

是的我正在使用可恢复的细胞。当图像加载时,我使用此代码将它们添加到单元格中 -

- (void)appImageDidLoad:(NSIndexPath *)indexPath
{

IconDownloader *iconDownloader = [imageDownloadsInProgress objectForKey:indexPath];
        if (iconDownloader != nil)
        {
            UITableViewCell *cell = (UITableViewCell *)[tblView cellForRowAtIndexPath:iconDownloader.indexPathInTableView];

            // Display the newly loaded image
            UIImageView *mixtapeImage =  (UIImageView *) [cell viewWithTag:TAG_IMAGE];
            mixtapeImage.image = iconDownloader.appRecord.mixtape_image_obj;

        }

}

你是对的,我没有发布图像,因为如果我向上滚动表格,我必须再次在单元格中添加图像,这就是为什么我在“imageDownloadsInProgress”字典中缓存它们。

有更有效的方法吗?

5 个答案:

答案 0 :(得分:2)

你回应内存警告吗?如果您这样做,并且您正确执行,您的应用程序将不会崩溃。 但是,如果你只是简单地滚动一个表视图,并且内存正在建立(它是否会不断增加,以及增加了多少?)就会出现问题。它可能就像自动释放池一样简单(你正在进行图像加载),但它可能会更严重。

在一台设备上看不到崩溃并不意味着它不会在具有不同状态的设备上崩溃(即:低内存状态)。

您可以使用工具屏幕截图更新帖子,也可以使用对象分配列表等

答案 1 :(得分:2)

滚动时内存增加不是一个好兆头。一个常见的问题是您正在重复使用单元格,并且您将堆积元素保持在彼此之上。单元格看起来很好,因为您只能看到最后一层UI元素。这些不是泄漏,因为它们被表格单元格引用为父视图。

在诊断方面,尝试使用“分配”工具来查看是否有比某些类型(例如,UIImages)更多的实时目标。这就是你要做的事情:

  

在Allocations乐器中,使用   在右上角的搜索框中搜索   “图片”。然后寻找专栏   在UIImage中标记为#linving。那   number是UIImage的数量   对象。这是一个更好的指南针   弄清楚你的位置   UIImages正在进行中。如果在某些时候你   有比你更多的对象   期待,而且这些UImage不是   走开你有一个UIImage泄漏   你的双手。 UIImage泄漏会导致死亡   你的应用真的很快。

引自this回答。

答案 2 :(得分:2)

问题很可能是缓存的图像,在这种情况下,最好的解决方案是在收到内存不足警告时从缓存中删除一些图像。您可以暂时将它们写入磁盘,这将在下次需要时提供比重新下载更快的加载时间。

答案 3 :(得分:1)

是的,它可能会导致崩溃。一旦考虑了后台进程,共享库和您自己的代码,您的应用程序在某些iOS设备上只有几兆字节的内存可用于自定义数据。如果你吹嘘它,即使你可以解释所有的分配,那么你将被低内存系统杀死。或者,无论如何,你的应用程序都会。

您已经推出了仪器,它让您了解应用在设备上的行为方式,成为iOS应用开发者的前1%。做得好!下一步是了解为什么在表格滚动时单调增加内存使用量的原因。好的,所以你在需要时懒洋洋地加载图像,但是当它们不存在时你会再次处理它们吗?使用带有可重用单元格的UITableView应该很容易,但也许你正在某处缓存图像并且永远不会清空缓存。当您在模拟器中发送低内存警告时,仪器会发生什么?

答案 4 :(得分:1)

您的cellForRowAtIndexPath方法是什么样的?你真的自动释放你在那里分配的细胞吗?

你不需要保留图像 - iOS非常擅长缓存结果,如果出于内存管理的原因想要释放单元格,你应该放弃它。

iOS 4.0之前版本的内存分配限制较低。这就是为什么应用程序在客户端的iPhone上崩溃而不是在你的iPhone上崩溃的原因。