【问题标题】:UIImagePickerController does not release memory it occupiesUIImagePickerController 不释放它占用的内存
【发布时间】:2012-03-28 14:11:07
【问题描述】:

我在为我的应用程序使用工具时看到了这个东西。当我分析我的应用程序时,占用的初始内存为 563 KB,在 UIImagePickerController 弹出之前。第一个 viewController 上有一个按钮,它使 UIImagePickerController 出现。
只要出现UIImagePickerController,占用的内存就会上升到1.6 - 1.7 MB。如果我选择任何图像或取消UIImagePickerController,占用的内存仍然是1.6 - 1.7 MB,我认为应该是563 KB(或者可能更多一些) .
请参阅我使用的以下代码:

- (IBAction)chooseButtonPressed:(id)sender
{
    UIImagePickerController *pickerController = [[UIImagePickerController new]autorelease];
    [pickerController setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    [pickerController setDelegate:self];
}  

为什么内存没有被释放?

【问题讨论】:

  • 看看这个go through this link.
  • 您查看的是overall bytes 占用还是live bytes?出于显而易见的原因,overall bytes 永远不会减少...
  • 是的,我正在查看整体字节数。但是为什么不会减少呢?
  • 这是已添加到内存中的所有字节的盲总和。释放内存时,总和不会减少。在overall bytes 的右边,必须有一列live bytes。观察此列中的值,您的问题将得到解答!
  • 实时字节数和总字节数相同。

标签: iphone ios uipickerviewcontroller


【解决方案1】:

我们无法将图像添加到 cmets,因此我将其作为答案。 Live Bytes 总是小于Overall Bytes,除非内存第一次被释放。这可以从下图中看出。

我认为您的解除分配没有任何问题。我认为您只是在查看错误的值!

EDIT- 我认为问题可能出在其他地方。要查看我看到的值,您需要进行一些更改。如下图所示,您需要取消选中选项 Only track active allocations 才能查看您要查找的值。如果您仍然在 Active allocations 中看到 7.41 MB,则问题出在其他地方。

【讨论】:

  • 请查看我编辑的问题。我添加了一个屏幕截图。 Live Bytes 与 Total Bytes 相同
  • @Nitish 请尝试我在编辑中提到的小改动。
  • 但是如何取消选中这个。此处不提供编辑选项。
  • 我遇到了问题。我正在检查泄漏而不是仪器上的分配。因此,实时字节和整体字节的值相同。但这有意义吗?
  • 只有在分析停止时才能取消选中。您可以随时重新开始。我不确定为什么在检查泄漏时实时字节和整体字节结果相同。可能是因为Only track active allocations 选项也被选中了。
【解决方案2】:

既然你给了它自动释放选项,它就会被添加到自动释放池中……看看文档怎么说..

Application Kit 在主线程上创建一个自动释放池 事件循环的每个周期的开始,并在 结束,从而释放同时生成的任何自动释放对象 处理一个事件。

你总是可以像这样在委托调用中释放选择器..

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
...
...
[picker release];

}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
....
....
[picker release];

}

【讨论】:

  • 你说的很对 Ankit。你建议的是我尝试过的最新的。
【解决方案3】:

试试这个

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

【讨论】:

  • 不,您当时尝试了 autorelease 而不是 autorelease 释放内存。并在- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 方法中写入[picker dismissModalViewControllerAnimated:YES];
【解决方案4】:

您是否将委托设置为nil

更多信息可以参考UIImagePickerConrtoller class reference

[picker release];
picker.delegate = nil ;

希望对你有所帮助。

【讨论】:

  • @Maulik:我编辑了答案并为 UIImagePickerController 添加了类参考,因为答案出现在Low Quality Post 下。
  • @ParthBhatt:谢谢...你在哪里找到低质量帖子???我不知道.. ;D
  • @Maulik 它位于review 部分下。我正在查看低质量帖子并找到您的帖子,因此对其进行了编辑。
  • @ParthBhatt:再次感谢...下次我会注意的...:D
  • @Maulik:我没有改变你的答案,因为我不能完全改变海报的答案。因为这可能会给他带来不利,有时也会在声誉方面造成优势。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-26
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多