【问题标题】:memory leak from method in analyzer分析器中方法的内存泄漏
【发布时间】:2012-03-25 21:11:14
【问题描述】:

我的第一个应用程序即将结束,我正在尝试检查我的错误和内存管理并清理所有内容。

在 xcode 的分析器中,以下行作为“潜在的内存泄漏”出现

- (NSMutableArray *) convertStringToASCIIMutableArray:(NSString *)stringIn {
    NSLog(@"call:convertStringToASCIIMutableArray");

    NSMutableArray *arrayOut = [[NSMutableArray alloc] initWithCapacity:stringIn.length];
    //NSMutableArray *arrayOut = [NSMutableArray arrayWithCapacity:stringIn.length];

    for (int i=0; i<stringIn.length; i++) {
        unichar ch = [stringIn characterAtIndex:i];
        if (ch > 96 && ch<123) ch = ch - 32; // convert to all capitals
        [arrayOut insertObject:[NSNumber numberWithChar:ch] atIndex:i];
    }
    return arrayOut;
}

但是当我删除 alloc 调用(如在注释行中或使用自动释放)时,应用程序崩溃。有人知道这里发生了什么吗?

【问题讨论】:

  • 了解您是否使用 ARC 非常重要。

标签: iphone objective-c ios xcode analyzer


【解决方案1】:

如果您在手动引用计数环境中,“arrayOut”不会自动释放。

return arrayOut更改为return [arrayOut autorelease],数组将在当前运行循环结束时释放。

【讨论】:

  • 这也不起作用。它说 arrayOut 已经发送了太多次自动释放
  • 非 ARC 的最佳实践是返回一个自动释放的对象,而不是在接收方法中调用 autorelease,这是我假设你正在做的。
【解决方案2】:

这里什么都没看到。存在“潜在泄漏”是因为您正在使用 alloc-init 创建可变数组,并且在方法完成时不释放它。由于您要返回对象,因此我建议您创建一个自动发布版本。

现在,对于应用在使用自动发布版本时崩溃的情况,您必须查看它崩溃的位置以及导致崩溃的原因。您知道在引发异常时设置断点吗?如果没有,请按照此操作,当崩溃发生时,代码将停在该行,以便您对其进行调试:

  • 在 xcode 中按 Command+6
  • 点击左下角的+按钮
  • 选择添加异常断点
  • 为所有异常设置选项,在 throw 上并点击 Done。

【讨论】:

  • 我已经使用断点进行试错调试,但这似乎更强大,谢谢。我试试这个
【解决方案3】:

好吧,我本身并没有真正解决我的问题,但我将我的项目转换为使用新的自动引用计数进行编译(ARC,感谢 @Kurt Revis 和 @Byron 让我注意到这个功能)

要转换我的项目,我只是去编辑>重构>转换为 Obj-C ARC。然后我必须按照重构窗口中显示的“检查”后的提示遵守新的内存管理规则。本质上,我必须在我的 dealloc 方法中删除一些版本,但它在问题导航器中提出了一些警报,告诉我该怎么做。

ARC 似乎很棒。更多信息在这里:

Steffen Itterheim

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多