uiimagepickerview控制器在iphone中创建内存泄漏 - 为什么?
尝试在您的应用程序中实现ui图像选择器视图控制器&调试它。 您将在应用程序中发现内存泄漏。 为什么ui图像选择器视图控制器会造成内存泄漏。
-(void)addPhotos:(id)sender
{
if(imagePickerController==nil){
imagePickerController=[[UIImagePickerController alloc]init];
imagePickerController.delegate=self;
imagePickerController.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum;
imagePickerController.allowsImageEditing=YES;
imagePickerController.navigationBar.barStyle=UIBarStyleBlackOpaque;
}
[self.navigationController presentModalViewController:imagePickerController animated:YES];
}
我的视图控制器dealloc。
- (void)dealloc {
if(PhotoDateArray!=nil)[PhotoDateArray release];
if(imagePickerController!=nil) [imagePickerController release];
if(objDetail!=nil) [objDetail release];
if(Picimage!=nil) [Picimage release];
if(mySavePhotoController!=nil) [mySavePhotoController release];
if(LoadingAlert!=nil);
[super dealloc];
}
视频链接解释了我如何获取内存泄漏..
答案 0 :(得分:2)
即使你有零检查,它仍然可能泄漏内存。我想这里发生的事情是你多次调用alloc / init,但只发布一次。我猜它addPhoto:
连接到某个按钮点击,dealloc只会在委托试图销毁时调用一次。这会产生如下情况:
更好的方法可能是Apple在PhotoLocations和iPhoneCoreDataRecipes示例中的表现方式:
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];
然后向您的代表收听didFinishPickingImage
和imagePickerControllerDidCancel
条消息,并且在这两个地方拨打[self dismissModalViewControllerAnimated:YES];
即可。
答案 1 :(得分:1)
我不知道其余的代码,但你有没有发布?
[imagePickerController release]
答案 2 :(得分:1)
UIImagePickerController
在第一次显示时加载并初始化PhotoLibrary.framework
。在您的申请被关闭之前,不会回收此内存。
(您发布的代码似乎没有按原样泄漏,但这并不意味着它不会以导致它们的方式与您应用程序的其余部分进行交互)
答案 3 :(得分:1)
我可以解释一下,因为我遇到了同样的问题。
不要在模拟器上测试内存! 如果您在设备上测试苹果代码,则内存问题会消失。
我在仪器中发现了内存分配泄漏。我所做的就是打开和关闭图像选择器(打开/取消)并使用Apple代码,我的代码和其他人的代码,就像你上面那样。
每次都显示出分配上升和上升,好像选择器没有被释放。如果你试图释放它,它会崩溃(过度释放)。
然后我发现了一个非常有用的网页,基本上说明了:
“在设备上进行测试时不会发生这种情况”
所以我从模拟器切换并在设备上运行测试。 Lo&看,没有分配增加,而且表现正常。
然而,这完全是邪恶的,现在我们不能信任模拟器来做可靠的工作。
我想加上这个来节省人们,想知道wtf的时间,痛苦和困惑正在发生!