真实内存不断增加-从视图中删除子视图- iOS (ARC)



我有一个iPad应用程序在iPad(第一款)上崩溃,因为它内存不足。

在应用程序中,我有一个主视图,它添加了大约20个UIScrollViews(自定义类)的子视图,每个子视图包含一个UIImageViewUIImage。当用户移动到下一页时,我从父视图中删除所有这些子视图,然后向同一视图添加20个新的UIScrollViews

如果我分析应用程序的分配和内存泄漏,一切都是好的-当用户向左和向右滚动时,分配的内存保持在2MB左右。

然而,如果我在Activity Monitor中查看实际内存使用情况,我可以看到每次用户移动到一个新页面时,实际内存增加约20MB。最终,在添加了几个新页面后,应用程序的大小达到了150+ MB并崩溃了。

谁能建议什么可能导致这种类型的行为,以及我如何进一步解决这个问题?

关于应用程序结构的更多信息:

  • 在视图确实加载图像被加载到NSMutableArray使用initWithContentsOfFile

您不应该在数组中维护这些图像。图像占用了您有限的RAM的不成比例的数量。有两种方法:

  1. 如果你想保持简单,只是不存储图像的任何地方。通过initWithContentsOfFile加载图像来加载UIImageViewimage属性,然后收服。

  2. 如果出于性能原因需要一些RAM缓存,您可以使用imageNamed而不是initWithContentsOfFile。当应用程序收到内存警告时,缓存将自动被清除。

  3. 我倾向于使用initWithContentsOfFile,但然后手动缓存在我自己的NSCache(这就像NSDictionary,除了你可以设置一个countLimit多少图像它应该挂在)。

顺便说一下,你没有描述当"用户移动到下一页"时技术上发生了什么。如果您只是刷新现有视图控制器上的现有控件,那么一切可能都很好(一旦您修复了我上面讨论的NSMutableArray问题)。如果你正在推送/呈现给另一个视图控制器,或者将控件滚动出屏幕,但忽略了从父视图中删除旧的控件,那么这也会导致问题。你可能需要澄清一下你在那里做什么。

最重要的是,你只需要确保当你从一个页面转到另一个页面时,你没有保持对任何旧图像或控件的强引用。

最新更新