iOS5.0.1上的内存泄漏drawInRect

时间:2011-11-23 03:04:15

标签: iphone ios ipad ios5 memory-leaks

我有以下用于缩放图像的代码片段。这是一个循环,为每次传递创建和排出自动释放池。此代码在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错误?

更新: 我尝试了很多测试。我已经能够证明使用XCode 4.0编译的完全相同的代码在同一台iPad上运行良好。使用XCode 4.2.1编译的相同代码会导致内存不足。 在后台线程中调用此缩放例程。我使用较低级别的核心图形调用编写了不同的缩放程序。它不会随XCode 4.0泄漏,但在我的应用程序中使用XCode 4.2.1时会泄漏。在独立项目中运行的完全相同的例程和调用树似乎不会泄漏(很多)XCode 4.2.1上的内存。 我正等着苹果听到这个。同时我需要使用XCode 4.我唯一的安装映像需要Snow Leopard,这意味着我正在使用我古老的5.5岁机器。 感谢

2012年1月更新 只有在XCode中启动应用程序时才会出现这种情况。在iPad上启动的相同可执行文件没有出现泄漏。具有相同例程的不同应用程序不会出现泄漏。

我已经向Apple发布了一个错误报告,并向他们发送了一个重现问题的项目。我不认为它会很快得到解决,但它似乎并不像我原先想象的那样普遍。

2012年6月更新 尽管已经向Apple发送了一个复制问题的最小项目,但他们声称无法重现问题并且没有取得任何进展。

2 个答案:

答案 0 :(得分:4)

我相信我最终找到了内存泄漏的原因。 我在做一些Core Data插入时发现了类似的行为。循环,创建许多已发布的对象。在iPad上运行时,内存使用量会增加,但在应用程序崩溃内存之前不会出现任何泄漏。但是当从设备启动时,它运行没有问题。

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

事实证明问题是由调试时NSZombieEnabled引起的。要在Xcode 4中禁用此设置,请右键单击方案,即app> targetDevice,编辑方案,选择Debug操作,参数选项卡。要启用NSZombieEnabled,将使用该名称创建一个环境变量,其值为YES,并且该变量已启用。要禁用它,请取消选中该复选框。

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

一旦我禁用了这个,我的应用程序曾经快速增长超过115MB,然后在iPad1上被杀死,现在很高兴在24MB,没有内存泄漏。

答案 1 :(得分:2)

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

我建议采用以下两个步骤:

  1. 发布您用于管理自动释放池的代码。
  2. 确保您在主线程中执行这些代码行(Apple's documentation表示这实际上很重要。)