【问题标题】:My application receives memory warning even when there is no valid memory leak即使没有有效的内存泄漏,我的应用程序也会收到内存警告
【发布时间】:2012-05-25 17:15:17
【问题描述】:

我的通用 iOS 应用程序遇到了这个奇怪的问题。在分析应用程序时,我在仪器工具中看不到任何有效的内存泄漏。每次页面更改时,分配的大小仍然会增加 50-100 kb。泄漏工具仅显示一些泄漏,责任调用者为 mem_alloc。

使用一段时间后,应用开始收到内存警告,并且在应用中的时间更长,应用崩溃。有趣的是,此时的总内存分配在 6 到 12 MB 之间变化。当我在调试模式下回溯时,应用程序也不显示任何堆栈信息。

我完全不知道为什么会发生这种崩溃。任何帮助将不胜感激。


附上我仪器的一些屏幕截图。

【问题讨论】:

  • 你试过静态内存分析器吗?
  • 我对静态内存分析器一无所知。你介意解释一下吗?

标签: iphone objective-c ios memory-leaks


【解决方案1】:

虽然我已经问了这个问题并且没有得到任何正确的答案已经很长时间了。在回到我的问题时,我认为解决这个问题将对其他早期初学者有所帮助。所以我在这里发布我的解决方案:

在这种情况下,真正的罪魁祸首是我在应用程序中使用图像的方式。我只是通过调用 [UIImage ImageNamed:] 来使用它。实际上,这种方法会泄漏图像大小的内存。

这个问题的解决方法是通过调用ImageWithData来使用图片(见下面的代码):

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];
[UIImage imageWithData:imageData];

希望这对某人有所帮助。

【讨论】:

  • 从原始帖子中不清楚您是否使用 ARC。如果您使用手动引用计数,您如何确定不是您处理 UIImage 文件?我很难相信 Apple 框架类方法已经以这种方式泄漏内存 2 年多了,而且没有引起注意。
  • @mckeejm 这个问题早在 2012 年就被问到了,那时我使用的是非 ARC 代码。我同意你的观点,即 Apple 框架类方法不应该像这样泄漏内存,我说它正在泄漏内存可能是错误的。本质上 imageNamed 函数会缓存图像数据,最终会占用内存。另外,如果您搜索 imageNamed 函数和 imageWithData 之间的比较,人们会建议您使用 imageWithData。
【解决方案2】:

您需要在您的应用程序中使用以下内容检查内存分配 -

  1. 使用Instruments检查AllocationLeaks

  2. 使用静态内存分析器检查静态内存泄漏。 要使用它,请使用“cmd+shift+B”或转到“Xcode -> Product -> Analyze”

您还需要确保正确释放视图控制器。

【讨论】:

  • 感谢您的快速回答。我已经做了你提到的两件事,然后才问了这个问题。
  • 您能否显示一些您的仪器的屏幕截图,其中内存使用量确切上升了。
  • 给我一些时间,我会在这里发布。
  • 附上我仪器的一些屏幕截图。如果你发现了什么,请你看看并告诉我吗?
  • 看到这个后,似乎是你的控制器没有正确释放,或者你只是在推动控制器,从不拉屎。再告诉我一件事,您是否也在处理您的应用中的一些图像?
猜你喜欢
  • 1970-01-01
  • 2011-07-31
  • 2011-10-23
  • 1970-01-01
  • 2016-08-15
  • 2011-12-25
  • 2012-10-20
  • 2015-07-07
相关资源
最近更新 更多