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

时间:2013-04-27 14:54:38

标签: ios objective-c memory-management profiling automatic-ref-counting

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

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

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

但是,如果我查看活动监视器中的实际内存使用情况,我可以看到每次用户移动到新页面时,实际内存增加大约20MB。最终在几个新页面之后,应用程序大小达到150多MB并崩溃。

任何人都可以建议可能导致此类行为的原因以及我如何进一步解决此问题?

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

  • 在视图中加载后,使用NSMutableArray将图片加载到initWithContentsOfFile

1 个答案:

答案 0 :(得分:1)

您不应该在阵列中维护这些图像。图像消耗的RAM数量不成比例。有几种方法:

  1. 如果您想保持简单,只是不要将图像存储在任何地方。通过image加载图片加载UIImageView的{​​{1}}属性并将其调用一天。

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

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

  4. 顺便说一句,您没有描述“当用户移动到下一页时”技术上发生了什么。如果您只是刷新现有视图控制器上的现有控件,那么一切都可能正常(一旦您解决了我上面讨论的NSDictionary问题)。如果您正在推送/呈现给另一个视图控制器或在屏幕上滚动控件而忽略从超级视图中删除旧控件,那么这也会导致问题。你可能想澄清你在那里做的事情。

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