【问题标题】:uiimagepickerview controller creating memory leaks in iphone - why?uiimagepickerview 控制器在 iphone 中创建内存泄漏 - 为什么?
【发布时间】:2010-11-29 15:53:00
【问题描述】:

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

视频链接解释了我是如何得到内存泄漏的..

http://www.yourfilelink.com/get.php?fid=508534

【问题讨论】:

标签: iphone uiimagepickercontroller


【解决方案1】:

我不知道其余的代码,但你们有发布吗?

[imagePickerController release]

【讨论】:

  • 先生 - 我肯定已经释放了那个对象。泄漏的类型为 ===== +[UIImagePickerController _loadPhotoLibraryIfNecessary]
  • 嗯,Apple 并不完美,他们有时会出现代码泄漏。如果你尽了最大的努力,但它仍然在内部泄漏,是时候把精力集中在你可以真正改变的事情上。
  • 另外,如果你发现了苹果内部的漏洞,请通过雷达提交一个错误,以便他们修复它。他们首先解决被报告的错误,并且照片库被广泛使用
  • 请观看视频。它将作出澄清。我现在只是在编辑问题。
【解决方案2】:

UIImagePickerController 在第一次显示时加载并初始化PhotoLibrary.framework。在您的应用程序关闭之前,不会回收此内存。

(您发布的代码似乎没有按原样泄漏,但这并不意味着它不会以导致泄漏的方式与您的应用程序的其余部分进行交互)

【讨论】:

  • 我已经从您给定的链接下载了示例代码。即使在苹果样本内存泄漏。请观看视频。它将作出澄清。我现在只是在编辑问题
【解决方案3】:

即使您有 nil 检查,仍然有可能泄漏内存。我认为这里发生的是您多次调用 alloc / init ,但只释放一次。我猜addPhoto: 连接到某个按钮单击,dealloc 只会在委托尝试销毁时调用一次。这会产生这样的情况:

  • 按钮点击
    • 分配/初始化
  • 按钮点击
    • alloc / init(第一个分配的选择器上的内存泄漏)
  • 关闭窗口
    • dealloc(免费的第二个分配选择器)

更好的方法可能是 Apple 在 PhotoLocationsiPhoneCoreDataRecipes 示例中的做法:

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];

然后收听didFinishPickingImageimagePickerControllerDidCancel 给您的代表的消息,并在这两个地方调用[self dismissModalViewControllerAnimated:YES]; 就足够了。

【讨论】:

  • 我已经从您给定的链接下载了示例代码。即使在苹果样本内存泄漏。请观看视频。它将作出澄清。我现在只是在编辑问题
  • 我怎么强调都不为过,如果您发现 SDK 内部存在漏洞,请报告错误以便修复
【解决方案4】:

我可以解释一下,因为我遇到了同样的问题。

不要在模拟器上测试内存! 如果您在设备上测试苹果代码,内存问题就会消失。

我在 Instruments 中发现了内存分配泄漏。我所做的只是打开和关闭图像选择器(打开/取消)并使用 Apple 代码、我的代码和其他人的代码,就像你上面的代码一样。

每次都显示分配不断增加,就好像选择器没有被释放一样。如果你试图释放它,它会崩溃(过度释放)。

然后我找到了一个非常有用的网页,基本上是这样的:

“在设备上测试时不会发生这种情况”

所以我从模拟器切换并在设备上运行测试。瞧瞧,分配并没有增加,而且表现正常。

然而,这完全是邪恶的,现在我们不能信任模拟器来完成可靠的工作。

我想添加这个来拯救人们,时间、痛苦和疑惑 wtf 正在发生的困惑!

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 2011-02-15
  • 2013-01-27
  • 2023-03-22
  • 1970-01-01
  • 2010-11-23
  • 2011-12-10
  • 2011-05-24
相关资源
最近更新 更多