ios - 实际内存不断增加 - 从 View 中删除 subview - iOS (ARC)

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

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

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

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

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

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

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

  • 在 View 加载中,图像使用 initWithContentsOfFile 加载到 NSMutableArray 中。

最佳答案

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

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

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

  3. 我倾向于使用 initWithContentsOfFile,但随后手动缓存在我自己的 NSCache 中(这类似于 NSDictionary,除了您可以设置一个 countLimit 它应该卡在多少图像上)。

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

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

关于ios - 实际内存不断增加 - 从 View 中删除 subview - iOS (ARC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16253523/

相关文章:

python - Python for 循环中的内存错误

ios - 修剪 NSString

ios - 如何在 iOS 的 NSArray 中获取未选择的数组

ios - 比较 Obj-C 中的对象,为什么它们不匹配?

c++ - 了解 union 的内存内容

c - 使用库函数 fopen() 打开文件时,与文件关联的缓冲区的大小是多少?

ios - 为登录和注销用户显示不同的标签栏项目

ios - UITextField attributedPlaceholder 无效

ios - UICollectionView 在 2^24 像素后分页

ios - viewDidAppear 选项卡切换 vs nav pop