1

Xcode KatasStringCalculator kata之后,我结束了下一节课。为什么我会在ARC中发现潜在的泄漏?

@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 

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

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

我还认为在ARC项目中调用release是过时或不必要的。

回答

3

如果我在最后做一个手工release,似乎满足您没有使用ARC分析仪

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

+0

而且,为了记录,您不会在任何其他行上泄漏内存,因为创建的所有其他对象都被添加到称为autorelease池的事物中 - 您有一个对它们的引用并保证它们的最短时间你会保持活力,但你不拥有它们,所以处理它们不是你的工作。对于临时值和返回结果来说,这是一种方便的机制,如果您先学习ARC,则可以推迟学习,但仍然是下面实现的细节。 – Tommy 2012-01-09 17:54:21