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();