分析器中方法的内存泄漏

时间:2012-03-25 21:11:14

标签: iphone objective-c ios xcode analyzer

我即将结束我的第一个应用程序,我试图通过我的错误和内存管理,并清理一切。

在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调用时(如在注释行中或使用autorelease),应用程序崩溃了。有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:0)

如果您处于手动引用计数环境中,

“arrayOut”不会自动释放。

return arrayOut更改为return [arrayOut autorelease],阵列将在当前runloop结束时释放。

答案 1 :(得分:0)

这里没有看到任何东西。之所以存在“潜在泄漏”,是因为您使用alloc-init创建可变数组,而在方法完成时不释放它。由于您要返回该对象,我建议您创建一个自动释放版本。

现在,当使用自动释放版本时应用程序崩溃,您将不得不查看它崩溃的位置以及导致崩溃的情况。您是否知道在引发异常时设置断点?如果没有,请按照此操作,当崩溃发生时代码将停在该行,以便您可以调试它:

  • 在xcode中按Command + 6
  • 点击左下角的+按钮
  • 选择添加例外断点
  • 设置所有例外的选项,在投掷和点击完成。

答案 2 :(得分:0)

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

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

ARC似乎很棒。更多信息请点击此处:

Steffen Itterheim

相关问题