UIImagePickerController内存泄漏

我在我的iPhone应用程序中使用UIImagePickerController时看到一个巨大的内存泄漏。 我正在使用苹果文件的标准代码来实现控制:

  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]; } 

didFinishPickingMediaWithInfocallback是一样的标准,虽然我甚至不必select任何东西导致泄漏。

当我所做的只是打开UIImagePickerController ,挑选照片库,然后重复按下cancel,我UIImagePickerController看到这些东西。 正如你可以看到内存不断增长,最终这导致我的iPhone应用程序巨大的减速。

在这里输入图像说明

正如你所看到的,我打开图像select器24次,每次它malloc'd 128KB这是从来没有释放。 基本上我的总6mb中的3mb从未被释放。

无论我做什么,这个记忆都会泄露。 即使离开当前的控制器,仍然是一样的。 我也实现了picker控件作为一个singleton有相同的结果。

这是我深入到这两行时所看到的:

在这里输入图像说明

任何帮助在这里将不胜感激! 再次,我甚至不必select一个图像。 我所做的只是呈现控制器,然后按取消。

更新1

我下载并运行了使用UIIMagePickerController苹果示例,当运行仪器(在模拟器和电话中)时,我看到发生相同的泄漏。

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

所有你需要做的就是点击照片库button,反复点击取消,你会看到内存不断增长。

有任何想法吗?

更新2

我在查看照片库时只能看到这个问题。 我可以select拍张照片,一遍又一遍地打开和closures,不会泄漏。

这是SDK中的一个错误。 向苹果提交报告。 我有samme isue。 这也是在这里logging: http : //www.cocoabuilder.com/archive/cocoa/285293-iphone-memory-leak-can-explain.html和一年前,仍然没有修复。

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

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

尝试在释放之前将UIImagePickerController.delegate设置nil

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

乐器中的“Mark Heap”button对我来说是追踪这类问题最好的方法。

这是一篇关于如何使用它的文章: http : //www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to -find-不期望的存储器生长/

但是,它肯定告诉你,哪些物体的存活时间比你预期的要长……最终,这个问题的根源是什么。

您还可以看到每个存活的单个物体的完整保留/释放轨迹,从而可以确定问题所在。

编辑:我也使用UIImagePickerControllers,我可以保证它不会泄漏(对我来说)你的build议的方式 – 所以,无论发生什么事情,这几乎肯定是可以解决的。

我使用了UIImagePickerController ,在捕获图像40次之后,我的应用程序收到了一条DidMemoryWarning消息并停下来,隐藏了我所有的视图。

在我的应用程序中,我创build了40个对象

 UIImagePickerController( new UIImagePickerController() ) 

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

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

 private static UIImagePickerController picker = new UIImagePickerController();