我有一个相当基本的应用程序,我正在更新 - 作为更新的一部分,我正在实施内存警告管理。
当调用内存警告方法时,我释放所有未使用的视图控制器(这些控制器依次释放它们的任何对象)。一切似乎都很好,据我所知,没有泄漏等。
什么不行:
使用'allocations'工具,在调用模拟硬件警告时,有大量内存未被释放。这是我在测试时所做的事情:
1 - 启动应用程序 - 这是下面显示的原始内存跳转。
2 - 添加一个新的视图控制器 - 这是第二个尖峰。
3 - 返回主视图控制器并模拟硬件内存警告 - 这是内存中的(小)下降。此警告应完全释放其他视图控制器和关联的对象。
虽然一切都已发布,但仍有大量内存。据我所知,这就像iOS所做的缓存动画等。在一个真正的低内存情况下,这应该被释放,而不是坚持,因为这是大多数内存的去处。
如何释放这种记忆 - 或者我做错了什么?任何指针都会非常感激 - 谢谢!
-
编辑:感谢您到目前为止的所有答案!虽然不幸的是我还没有能够解决这个问题。此外,使用模态视图控制器时,似乎只会发生内存怪异。
我注意到我实际上有一个后台加载方法,用于在应用启动时调用的额外视图控制器,以使事情顺利运行。这表明内存中的第二个峰值完全是由于视图控制器的其他东西 - 可能是动画或其他东西?无论如何问题仍然存在 - 这个额外的内存用于什么,以及如何在需要时释放它?
我可能会创建一个展示行为的迷你项目,如果有帮助的话。谢谢:))
答案 0 :(得分:2)
你真的确定你没有保留你的UIViewController或它的对象吗?在释放控制器后,您不必模拟内存警告以查看分配减少。 我附上了一个屏幕截图,显示了在使用UINavigationController推送和弹出UIViewController三次之后我的应用程序的外观。
修改强>
回答你的评论:UIViewController属于UIKit并且不是线程安全的,这意味着你不应该在后台线程中创建一个。这可能是内存泄漏的原因,因为它不会被添加到主自动释放池中。
答案 1 :(得分:2)
有一个非常棒的关于内存分析的截屏视频来自WWDC 2010的仪器。这就是我学习如何跟踪类似问题的方法。
你应该看看http://developer.apple.com/videos/wwdc/2010/。具体http://developer.apple.com/videos/wwdc/2010/?id=311。