UIImagePickerController内存泄漏

时间:2011-07-01 23:52:24

标签: iphone objective-c ios memory-leaks uiimagepickercontroller

在iPhone应用中使用UIImagePickerController时,我发现内存泄漏严重。我使用apple文档中的标准代码来实现控件:

    UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.delegate = self;
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        switch (buttonIndex) {
            case 0:
                imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
                [self presentModalViewController:imagePickerController animated:YES];
                break;
            case 1:
                imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
                [self presentModalViewController:imagePickerController animated:YES];
                break;
            default:
                break;
        }
    }

取消:

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
    [picker release];
}

didFinishPickingMediaWithInfo回调就像标准一样,虽然我甚至不需要选择任何导致泄漏的东西。

以下是我在乐器中看到的内容,我所做的只是打开UIImagePickerController,选择照片库,然后反复按取消。正如您所看到的,内存不断增长,最终导致我的iPhone应用程序速度大幅下降。

enter image description here

正如你所看到的那样,我打开了24次图像选择器,每次都是malloc'd 128kb,它从未发布过。基本上我总共6mb中的3mb从未被释放。

无论我做什么,这个记忆都会泄露。即使在离开当前控制器之后,仍然是相同的。我还将拾取器控件实现为具有相同结果的单例。

以下是我深入研究这两行时所看到的内容:

enter image description here

这里的任何帮助将不胜感激!再说一次,我甚至不必选择图像。我只是出现控制器,然后按取消。

更新1

我下载并运行了苹果使用UIIMagePickerController的示例,我发现在运行乐器时(在模拟器和手机上)都会发生同样的泄漏。

http://developer.apple.com/library/ios/#samplecode/PhotoPicker/Introduction/Intro.html%23//apple_ref/doc/uid/DTS40010196

您只需点击照片库按钮并反复点击取消,您就会看到内存不断增长。

有什么想法吗?

更新2

我只在查看照片库时才看到此问题。我可以选择拍照,一遍又一遍地打开和关闭那张照片,没有泄漏。

5 个答案:

答案 0 :(得分:5)

这是SDK中的一个错误。向Apple提交报告。我有samme isue。这里还记录了:http://www.cocoabuilder.com/archive/cocoa/285293-iphone-memory-leak-can-explain.html 那是一年多以前的事了,但仍然无法解决。

答案 1 :(得分:1)

由于2.x中的泄漏,我们的一些应用程序重用了相同的UIImagePickerController(这让我感觉很老......)。我的印象是泄漏是固定的,但我可能是错的。

这是一个有点可怕的解决方法,但有时这是你能做的最好的。

答案 2 :(得分:0)

尝试在发布之前将UIImagePickerController.delegate设置为nil

-(void) imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
    picker.delegate = nil;
    [picker release];
}

答案 3 :(得分:0)

对我来说,乐器中的“马克堆”按钮是追踪这些问题的最佳方式。

这是关于如何使用它的 OK 文章:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

肯定会告诉你哪些对象存活的时间比你预期的要长......最终,问题的根源是什么。

您还可以查看幸存的每个单独对象的完整保留/释放跟踪 - 允许您查明问题所在。

编辑:我也使用UIImagePickerControllers,我可以保证它不会像你建议的那样泄漏(对我而言) - 所以,无论发生什么,它几乎肯定是可以修复的。

答案 4 :(得分:0)

我使用UIImagePickerController,在40张捕获图片后,我的应用程序收到DidMemoryWarning消息并停止,隐藏了我的所有观看次数。

在我的应用程序中,我创建了40个

对象
UIImagePickerController( new UIImagePickerController() )

为了正常工作,我创建了一个与所有应用程序共享的唯一实例,并且这一切都正常工作。

我认为控制也失去了记忆,但只有一次。我的应用程序可以正确地从相机中捕获图像:

private static UIImagePickerController picker = new UIImagePickerController();