1
在Xcode Katas的StringCalculator 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
,它似乎满足分析仪,但我不明白为什么会发生这种情况。
如何创建mutableCopy
与substringWithRange
不同?我不知道如何检查我是否使用ARC,但如果我不是,我应该在创建对象的每一行都漏出内存吗?
我还认为在ARC项目中调用release
是过时或不必要的。
而且,为了记录,您不会在任何其他行上泄漏内存,因为创建的所有其他对象都被添加到称为autorelease池的事物中 - 您有一个对它们的引用并保证它们的最短时间你会保持活力,但你不拥有它们,所以处理它们不是你的工作。对于临时值和返回结果来说,这是一种方便的机制,如果您先学习ARC,则可以推迟学习,但仍然是下面实现的细节。 – Tommy 2012-01-09 17:54:21