【问题标题】:iphone -- Memory leak although ARC [closed]iphone——虽然ARC存在内存泄漏[关闭]
【发布时间】:2012-11-29 12:50:09
【问题描述】:

虽然启用了自动引用计数,但我遇到了内存泄漏。

我做了一点调试,发现了应用程序获取此输出的问题: *** error: can't allocate region*** set a breakpoint in malloc_error_break to debug

我一直追踪到这一点:

if (currentTime < 60) {
    currentTimeMin = 0;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime];
}
if (currentTime >= 60) {
    currentTimeMin = 1;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -60];
}
if (currentTime >= 120) {
    currentTimeMin = 2;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -120];
}
if (currentTime >= 180) {
    currentTimeMin = 3;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -180];
}
if (currentTime >= 240) {
    currentTimeMin = 4;
    ct.text = [NSString stringWithFormat:@"%i:%i", currentTimeMin, currentTime -240];
}
if (totalTime < 60) {
    totalTimeMin = 0;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime];
}
if (totalTime >= 60) {
    totalTimeMin = 1;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -60];
}
if (totalTime >= 120) {
    totalTimeMin = 2;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -120];
}
if (totalTime >= 180) {
    totalTimeMin = 3;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -180];
}
if (totalTime >= 240) {
    totalTimeMin = 4;
    tt.text = [NSString stringWithFormat:@"%i:%i", totalTimeMin, totalTime -240];
}

我认为问题出在标签上:ct 和 tt,但我不确定并且似乎无法弄清楚原因。直到一天前我对 UITableVIews 进行了一些试验,一切都运行良好。

最好的问候!马丁

【问题讨论】:

  • 您是否尝试过添加malloc_error_break 断点的建议?
  • 您将相同的文本设置了 4 次。有什么理由吗?
  • stringWithFormat 本身不会造成问题。虽然可能是你已经丢弃了堆,而 stringWithFormat 是发现它的地方。
  • (假设 currentTime 为 60 并研究控制将如何流经您的代码。)
  • (在尝试更多使用 Objective-C 之前,请考虑使用 Java 一段时间。)

标签: iphone objective-c ios memory-management xcode4.5


【解决方案1】:

这段代码是否在循环中?如果是,则需要将代码放入自动释放池中。

while(someStuff) {
    @autoreleasepool {
        //Your code here
    }
}

【讨论】:

  • 为什么需要使用显式自动释放池?因为正在创建的字符串对象的数量?默认情况下,它们都将放置在主应用程序池中。当然,它们的使用时间可能比预期的要长,因为每次通过循环时池都不会被排干,但它们不会显示为泄漏,不是吗?
  • @Metabble 如果您在循环中创建了足够多的自动释放对象,您的应用程序可能会在自动释放对象释放之前耗尽内存。通过在循环中使用这样的显式自动释放池,您可以确保这不是问题。这是适当的 pre-ARC 和 ARC。对象没有泄漏,但如果循环中没有自动释放池,它们只会不断累积,因为循环会阻止它们被及时清理。
  • @rmaddy 感谢您尝试解释。我没有很好地解释自己。我知道在循环内有一个自动释放池的好处;而不是在最后释放所有自动释放的对象,而是在循环的每次迭代结束时释放它们。我是说虽然这可能会提高效率,但它并不能阻止内存泄漏,因此不是答案;应该是评论。他问他为什么会出现内存泄漏,而不是如何在循环中使用自动释放池来提高效率。它只是让我感到困惑。
  • @Metabble 提问者报告的错误是当没有足够的可用内存时得到的。他写的代码不应该泄漏,但如果你在一个循环中并创建自动释放的对象,它可能看起来像内存泄漏,即使它不是。
  • @SimonGoldeen 啊,我明白了。这就说得通了。谢谢你的解释。我应该已经看到错误并仔细考虑了。
【解决方案2】:

那段代码不应导致泄漏。你的错误在别处。启用保护 malloc 并阅读有关调试和分析 Objective-c 的信息。

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 2012-09-14
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 2017-10-03
    • 2013-08-19
    • 1970-01-01
    相关资源
    最近更新 更多