4

我有一个 iPad 应用程序由于内存不足而在 iPad(第一个型号)上崩溃。

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

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

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

谁能建议可能导致这种行为的原因以及如何进一步解决此问题?

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

  • 在视图中确实加载了图像被加载到NSMutableArrayusing 中initWithContentsOfFile
4

1 回答 1

1

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

  1. 如果您想保持简单,请不要将图像存储在任何地方。通过加载图像来加载属性image并收工。UIImageViewinitWithContentsOfFile

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

  3. 我倾向于使用initWithContentsOfFile,然后手动缓存在我自己的中NSCache(这就像 a NSDictionary,除了你可以设置 acountLimit它应该挂起的图像数量)。

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

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

于 2013-04-27T16:00:26.460 回答