Dav*_*vid 12 iphone memory-leaks ipad ios ios5
我有以下用于缩放图像的代码片段.这是一个循环,为每次传递创建和排出自动释放池.此代码在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();
Run Code Online (Sandbox Code Playgroud)
我做错了什么或这是一个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岁的机器.谢谢
Update 1/2012仅当应用程序从XCode内启动时才会出现这种情况.在iPad上启动的相同可执行文件没有出现泄漏.具有相同例程的不同应用程序不会出现泄漏.
我已经向Apple打开了一个错误报告,并向他们发送了一个重现问题的项目.我不认为它会很快得到解决,但它似乎并不像我原先想象的那样普遍.
更新6/2012尽管已经向Apple发送了一个复制问题的最小项目,但他们声称无法重现问题而且没有取得任何进展.
我相信我终于找到了内存泄漏的原因。在执行一些核心数据插入时,我发现了类似的行为。循环,创建许多已释放的对象。在iPad上运行时,内存消耗会增加,尽管直到应用程序崩溃而没有明显的泄漏。但是,从设备启动后,它可以正常运行。
在我看来,这与从Xcode开始的方式有关。必须是项目中的调试设置。
原来问题出NSZombieEnabled在调试时。要在Xcode 4中禁用此设置,请在方案(即app> targetDevice)上单击鼠标右键,编辑方案,然后选择“调试”操作,“参数”选项卡。要启用NSZombieEnabled,将使用该名称创建的环境变量,其值为YES,并启用该变量。要禁用它,请取消选中该复选框。
NSZombieEnabled用于确定您是否尝试释放已经释放的对象。为此,环境要跟踪所有释放的对象。这正在消耗内存,这似乎是内存泄漏。
一旦禁用此功能,我的应用程序在iPad1上被杀死之前曾经迅速增长到115MB以上,现在愉快地位于24MB,没有内存泄漏。
| 归档时间: |
|
| 查看次数: |
5074 次 |
| 最近记录: |