我有一个iPad应用程序在iPad(第一款)上崩溃,因为它内存不足。
在应用程序中,我有一个主视图,它添加了大约20个UIScrollViews
(自定义类)的子视图,每个子视图包含一个UIImageView
和UIImage
。当用户移动到下一页时,我从父视图中删除所有这些子视图,然后向同一视图添加20个新的UIScrollViews
。
如果我分析应用程序的分配和内存泄漏,一切都是好的-当用户向左和向右滚动时,分配的内存保持在2MB左右。
然而,如果我在Activity Monitor中查看实际内存使用情况,我可以看到每次用户移动到一个新页面时,实际内存增加约20MB。最终,在添加了几个新页面后,应用程序的大小达到了150+ MB并崩溃了。
谁能建议什么可能导致这种类型的行为,以及我如何进一步解决这个问题?
关于应用程序结构的更多信息:
- 在视图确实加载图像被加载到
NSMutableArray
使用initWithContentsOfFile
。
您不应该在数组中维护这些图像。图像占用了您有限的RAM的不成比例的数量。有两种方法:
-
如果你想保持简单,只是不存储图像的任何地方。通过
initWithContentsOfFile
加载图像来加载UIImageView
的image
属性,然后收服。 -
如果出于性能原因需要一些RAM缓存,您可以使用
imageNamed
而不是initWithContentsOfFile
。当应用程序收到内存警告时,缓存将自动被清除。 -
我倾向于使用
initWithContentsOfFile
,但然后手动缓存在我自己的NSCache
(这就像NSDictionary
,除了你可以设置一个countLimit
多少图像它应该挂在)。
顺便说一下,你没有描述当"用户移动到下一页"时技术上发生了什么。如果您只是刷新现有视图控制器上的现有控件,那么一切可能都很好(一旦您修复了我上面讨论的NSMutableArray
问题)。如果你正在推送/呈现给另一个视图控制器,或者将控件滚动出屏幕,但忽略了从父视图中删除旧的控件,那么这也会导致问题。你可能需要澄清一下你在那里做什么。
最重要的是,你只需要确保当你从一个页面转到另一个页面时,你没有保持对任何旧图像或控件的强引用。