【问题标题】:IOS app killed for Low Memory but no Memory Warning receivedIOS 应用程序因内存不足而被终止,但未收到内存警告
【发布时间】:2012-01-16 17:27:42
【问题描述】:

我现在遇到一个问题已经有一段时间了,我想知道是否有人可以提供帮助。 我正在使用主导航控制器和大量 UIImage 开发 IOS 应用程序(iPad)。 使用该应用程序一段时间后,该应用程序因内存不足(不在特定视图中)而被杀死,但通过检查 iPad 日志,我并不总是看到内存不足警告(有时我会,有时我不会)。 即使我收到一个,也只是“Low Memory Warning received”,但我从未收到“Level 1”或“Level 2”。

通过使用 xCode 的 Leak 工具,我找不到任何泄漏。

谁能帮忙?

【问题讨论】:

  • 您是否可能在某处请求大量分配?
  • 我想过这个,但不是真的... =/
  • 如果我以不同的顺序访问我的视图控制器,它会在其他地方做同样的事情。
  • 我也有类似的问题。我怀疑我的问题是由于 UI 线程被阻塞了很长时间。你找到解决办法了吗?

标签: ios xcode ipad memory memory-leaks


【解决方案1】:

内存警告作为通知发送,因此一旦机会出现,它将在运行循环中排队等待调度。如果您要编写一个(故意破坏的)循环,例如:

while(1)
{
    NSString *newString = [NSString string];
}

那么最终您的应用会因内存不足而被终止,但它绝不会收到内存不足的警告。

如果你因为内存不足而被杀死而没有收到警告,那么你可能在某个地方为自己制造了内存瓶颈,很可能你有某种循环,在自动释放池中留下了很多东西——所以,如果你一直通过循环,那么临时对象就会消失,因此没有长期足迹,但它们会一直在你留在循环中的时间累积。

为避免这种情况,您需要查看循环的内部部分嵌套在它们自己的NSAutoreleasePools 中。比如这个循环:

while(1)
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSString *newString = [NSString string];
    [pool drain]; // stylistically preferred to release, but equivalent
                  // in reference counted environments
}

将永远持续,但永远不会触发内存不足的情况。

【讨论】:

  • 关于如何识别因内存不足而死的循环有什么建议吗? ...我正在开发一个存在此问题的大型应用程序(没有内存通知 - 只是崩溃)并且它有很多地方使用大量内存。很难分辨哪个是哪个,因为 Apple 从分配中隐藏了他们所有的图像/CG/CALayer 渲染 - 而且应用程序中有很多很多循环。除了将 NSAutoReleasePools EVERYWHERE 放在应用程序中之外,有任何关于自动/主动缩小范围的建议吗?
【解决方案2】:

你也可以试试内存泄漏,Apple的Xcode开发环境提供了一个内存泄漏检测工具,最简单的运行方式是直接从

Xcode: 1.产品 -> 2.从性能工具(Profiler)开始-> 3.从仪器中选择泄漏。

它似乎非常擅长检测内存泄漏,并且很容易弄清楚。

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 2013-05-24
    • 2015-05-06
    • 2019-11-19
    • 2014-02-23
    • 1970-01-01
    • 2015-09-22
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多