我有以下用于缩放图像的代码片段。这是一个循环,为每次传递创建和排出自动释放池。此代码在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发送了一个复制问题的最小项目,但他们声称无法重现问题并且没有取得任何进展。
答案 0 :(得分:4)
我相信我最终找到了内存泄漏的原因。 我在做一些Core Data插入时发现了类似的行为。循环,创建许多已发布的对象。在iPad上运行时,内存使用量会增加,但在应用程序崩溃内存之前不会出现任何泄漏。但是当从设备启动时,它运行没有问题。
我想到了它从Xcode开始的方式。必须是项目中的调试设置。
事实证明问题是由调试时NSZombieEnabled
引起的。要在Xcode 4中禁用此设置,请右键单击方案,即app> targetDevice,编辑方案,选择Debug操作,参数选项卡。要启用NSZombieEnabled
,将使用该名称创建一个环境变量,其值为YES,并且该变量已启用。要禁用它,请取消选中该复选框。
NSZombieEnabled
用于确定您是否尝试释放已释放的对象。为此,环境将跟踪所有已释放的对象。这消耗内存,显示为内存泄漏。
一旦我禁用了这个,我的应用程序曾经快速增长超过115MB,然后在iPad1上被杀死,现在很高兴在24MB,没有内存泄漏。
答案 1 :(得分:2)
您发布的代码不应导致泄密。泄漏绝对是其他地方。
我建议采用以下两个步骤: