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

我真的把我的头发拉出来,看起来我在iOS应用上遇到了内存pipe理方面的严重问题。

这里的情况是:首先我加载表。 当用户点击一个单元格时,呈现一个复杂的视图。 消耗大部分视图的内存是加载了20个500×500的UIImage 。 在该视图中还有两个选项卡,加载一个媒体列表(那些UIImage ,然后在一个表格中)和另一个简单的表格。

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

我试图解决它:

  • 修复所有的分析问题,所以根据这个,没有泄漏了。
  • 再次检查所有的init ,释放,尽可能使用autorelease
  • 使用“仪器 – >泄漏”检查所有内存泄漏。 在6的运行时间,我得到不超过2或3个泄漏。
  • 最后,仪器 – >分配,检查堆。 这是困扰我的两个标记的堆积之间,我得到了250 + kB的差异。 我已经看过它,使用详细的意见。 我无法理解它:当它指向我的一个方法/类时,我很确定那里的所有东西都是释放或者自动释放的。 它也指向了很多不是我的(比如说QuartzCore )的方法/类。

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

任何帮助是极大的赞赏。

亲切的问候,

雷因德

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

我认为你可能想先尝试优化你的devise,阅读高效的内存pipe理指南。 对组件和运行时的更好的了解不仅有助于跟踪内存分配,而且还可以更容易地find泄漏。

  • 首先你应该总是使用版本 。 必要时只使用autorelease
  • 确保遵循UITableView实现的指导原则和UITableViewCells的有效pipe理(延迟加载,单元重用等)。
  • 检查是否有保留周期(保留的视图控制器不会被释放)。
  • 跟踪您的视图控制器和对象的重新分配
  • 不要把东西留在你不需要的记忆中。
  • 不要加载你现在不需要的东西。

你是否使用imageNamed来加载你的图像 – 这种方法将保持所有图像caching在内存中。 尝试使用initWithContentsOfFile

当心; initWithContentsOfFile:根本不会caching,所以如果你对同一个图像使用这个方法很多,那么你应该使用imageNamed: