内存泄漏drawInRect在iOS5.0.1上

我有以下代码片段,我用来缩放图像。 这是在一个循环中创build和消耗每次通过自动释放池。 此代码在iOS5.0的模拟器,iPad或模拟器上的iOS4.3中可以正常工作,但在iPad1上的iOS5.0.1上,在经过50-60次之后,drawInRect开始消耗永远不会释放的内存。 我一直从辅助线程调用这个,但是现在调用主线程上的缩放操作。

UIGraphicsBeginImageContext( newSize ); [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)]; UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); 

我做错了什么或者这是一个iOS5.0.1的错误?

更新:我已经尝试了很多testing。 我已经能够certificate,使用XCode 4.0编译的完全相同的代码在同一台iPad上运行良好。 使用XCode 4.2.1编译的相同代码会导致内存不足的情况。 这个缩放例程正在后台线程中调用。 我使用较低级别的核心graphics调用编写了不同的缩放例程。 它不会与XCode 4.0一起泄漏,但在使用XCode 4.2.1的应用程序时会泄漏。 在独立项目中运行的完全相同的例程和调用树在XCode 4.2.1上似乎不会泄漏(太多)内存。 我正等着从这个苹果的消息。 同时,我需要使用XCode 4.我唯一的安装镜像要求雪豹,这意味着我使用我的古老的5.5岁的机器。 谢谢

2012年1月更新这似乎只发生如果应用程序是从XCode内启动。 在iPad上启动的相同的可执行文件不会显示泄漏。 具有相同程序的不同应用程序不会显示泄漏。

我已经向苹果公司发布了一个错误报告,并向他们发送了一个重现问题的项目。 我不认为这个问题很快就能得到解决,但似乎并不像我原先想象的那么普遍。

更新6/2012尽pipe已经发送了苹果一个最小的项目,再现了这个问题,他们声称不能重现这个问题,并没有取得任何进展。

我相信我最终find了内存泄漏的原因。 在做一些核心数据插入时,我发现了类似的行为。 循环播放,创build许多被释放的对象。 在iPad上运行时,内存使用量会增加,但应用程序崩溃后内存不会泄漏。 但是,从设备启动时,它运行没有问题。

我想到了它从Xcode开始的方式。 必须是项目中的debugging设置。

事实certificate,这个问题是由debugging时有NSZombieEnabled引起的。 要在Xcode 4中禁用此设置,请右键单击这些scheme,即app> targetDevice,编辑scheme,selectDebug操作,参数选项卡。 为了启用NSZombieEnabled ,创build一个名为YES的环境variables,并启用该variables。 要禁用它,请取消选中checkbox。

NSZombieEnabled用于确定是否尝试释放已释放的对象。 为此,环境正在跟踪所有发布的对象。 这是消耗内存,这显示为内存泄漏。

一旦我禁用了这个function,我的应用程序曾经快速增长超过115MB,然后在iPad1上死亡,现在快乐地坐在24MB,没有内存泄漏。

您发布的代码不应该导致泄漏。 泄漏绝对是其他地方。

我会build议以下两个步骤:

  1. 发布你用来pipe理自动释放池的代码。
  2. 确保你在主线程中执行这些代码行( Apple的文档表明这实际上很重要)。