在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应用程序速度大幅下降。
正如你所看到的那样,我打开了24次图像选择器,每次都是malloc'd 128kb,它从未发布过。基本上我总共6mb中的3mb从未被释放。
无论我做什么,这个记忆都会泄露。即使在离开当前控制器之后,仍然是相同的。我还将拾取器控件实现为具有相同结果的单例。
以下是我深入研究这两行时所看到的内容:
这里的任何帮助将不胜感激!再说一次,我甚至不必选择图像。我只是出现控制器,然后按取消。
我下载并运行了苹果使用UIIMagePickerController
的示例,我发现在运行乐器时(在模拟器和手机上)都会发生同样的泄漏。
您只需点击照片库按钮并反复点击取消,您就会看到内存不断增长。
有什么想法吗?
我只在查看照片库时才看到此问题。我可以选择拍照,一遍又一遍地打开和关闭那张照片,没有泄漏。
答案 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();