为什么我会因ARC而潜在泄漏?

时间:2012-01-09 13:19:09

标签: objective-c memory-management memory-leaks automatic-ref-counting

StringCalculatorXcode Katas kata之后,我结束了以下课程。

@implementation StringCalculator

- (int) add: (NSString *) string {    
    // this is marked as a potential memory leak by the `Analyze` tool
    NSMutableString *separatorCharacters = [@"\n" mutableCopy];

    if ([string hasPrefix:@"//"]) {
        NSRange range = NSMakeRange(2, 1);
        NSString *additionalSeparator = [string substringWithRange:range];
        [separatorCharacters appendString:additionalSeparator];
    } else {
        [separatorCharacters appendString:@","];
    }

    NSCharacterSet *separators = [NSCharacterSet characterSetWithCharactersInString:separatorCharacters];
    NSArray *numbers = [string componentsSeparatedByCharactersInSet:separators];

    // [separatorCharacters release];

    int sum = 0;    
    for (NSString *number in numbers) {
        sum += [number intValue];
    }
    return sum;
}

@end

一切正常,但是当我运行Analyze时,我在方法的第一行遇到了潜在的内存泄漏。如果我最后做了一个手册release,它似乎满足了分析仪,但我真的不明白为什么会发生这种情况。

例如,创建mutableCopysubstringWithRange的区别如何?我不知道如何检查我是否使用ARC,但如果我不是我应该在我创建对象的每一行上泄漏内存吗?

我还认为在ARC项目中调用release有点被弃用或不必要。

1 个答案:

答案 0 :(得分:3)

  

如果我最后做了手册release,它似乎满足了分析仪

您没有使用ARC。 ARC禁止手动释放,这不会编译。检查您的构建设置。