内存管理,自动释放,永久堆的问题有时在iOS上超过250 kb

时间:2012-01-17 16:18:32

标签: objective-c ios memory-management autorelease

我真的把头发拉出来了,似乎我在iOS应用程序上遇到了严重的内存管理问题。

以下是这种情况:首先我加载表格。当用户点击一个单元格时,它会呈现一个复杂的视图。关于视图的最大内存消耗是它加载了20 + 500 {500}的UIImage s。该视图中还有另外两个选项卡,加载媒体列表(那些UIImage,然后在表格中)和另一个简单表格。

当我返回到第一个表视图时,仍然在堆上分配了超过250 kB。我知道这个观点很复杂,但是没有理由保持这么多记忆。好吧,猜猜看,当我切换到视图时,最终应用程序耗尽内存并被杀死。

我试图解决它:

  • 修复所有分析问题,因此不再有泄漏。
  • 再次检查所有init是否已发布,尽可能使用autorelease
  • 使用Instruments检查所有内存泄漏 - >泄漏。在6的运行时间里,我得到的泄漏不超过2或3次。
  • 最后,仪器 - >分配,检查堆。这让我感到困扰,在两个标记的快照之间我得到250+ kB的差异。我使用详细的视图调查了它。我无法理解它:当它指向我的一个方法/类时,我很确定那里的所有内容都已发布或自动释放。它也指向了很多非我的(比如QuartzCore)方法/类。

另外,我不明白为什么autorelease没有自动释放。我的意思是,它有时看起来像一个被标记为自动释放的对象,被释放得太晚了。我自己没有创建任何NSAutoreleasePool,所以只有在运行时停止时池才可能耗尽?我怎样才能定期排水池(即使它不是我的)。

非常感谢任何帮助。

亲切的问候,

雷因德

用于堆检查:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

2 个答案:

答案 0 :(得分:2)

您是否使用imageNamed加载图片 - 此方法会将所有图片缓存在内存中。请改为initWithContentsOfFile

注意; initWithContentsOfFile:根本不会缓存,所以如果你对同一张图片大量使用这种方法,那么你使用imageNamed:

答案 1 :(得分:1)

我认为您可能希望首先尝试优化您的设计并阅读有效的内存管理指南。更好地理解组件和运行时不仅有助于跟踪内存分配,还可以更容易地找到泄漏。

  • 首先,您应该始终使用发布。仅在必要时使用 autorelease
  • 确保遵循UITableView实施指南和UITableViewCells的有效管理(延迟加载,单元重用等)。
  • 检查您是否有保留周期(保留的视图控制器不会被取消分配)。
  • 跟踪视图控制器和对象的重新分配
  • 不要把东西留在你不再需要的记忆中。
  • 不要加载你现在不需要的东西。