4

我有一个iPad应用程序在iPad上崩溃(第一个模型),因为它内存不足。真正的内存不断增加 - 从视图中删除子视图 - iOS(ARC)

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

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

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

任何人都可以提出什么可能会导致这种类型的行为,以及如何进一步排除故障?上的应用程序结构的更多

只是有点信息:

  • 鉴于没有加载图像使用initWithContentsOfFile装入NSMutableArray

回答

1

你不应该在一个数组中维护这些图像。图像消耗不成比例的有限RAM。有几种方法:

  1. 如果你想保持简单,就不要将图像存储在任何地方。通过initWithContentsOfFile加载图片并加载UIImageViewimage属性并将其称为一天。

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

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

顺便说一句,您没有描述“用户移动到下一页”时在技术上会发生什么。如果你只是刷新现有视图控制器上的现有控件,那么一切都可能是好的(一旦你解决了我上面讨论的NSMutableArray问题)。如果您正在推送/呈现给另一个视图控制器或滚动屏幕上的控件,但忽略从他们的超级视图中删除旧视图,那么这也会导致问题。你可能想澄清你在那里做什么。底线,你只需要确保当你从一个页面到另一个页面时,你不会保留对任何旧图像或控件的强引用。

+0

这一切都发生在相同的UIView。这些对象被添加到视图中,被删除,然后添加新的(在这种情况下是一个自定义的UIScrollView)对象。我仍然不清楚我的原始问题 - 为什么只有在新对象添加到视图(通过self.view addSubview x)时,真实内存才会增加?这些对象被放置在viewDidLoad方法的数组中,并且实际内存在此时不会增加(它很低且不变)。 – GuybrushThreepwood 2013-04-27 17:00:01

+0

@Ohnomycoco在这种情况下,我们可能需要查看一些源代码来诊断问题。但显然,当你进入下一页时,你正在添加一些东西。根据目前共享的内容进行诊断是不可能的。 – Rob 2013-04-27 17:11:41

+0

@Onomycoco您也可以使用Allocations工具(如[此处](http://stackoverflow.com/a/14105056/1271826)所示)来确定分配中的跳转,突出显示图表的一部分,并显示你正是什么导致了内存的消耗。 – Rob 2013-04-27 18:41:47