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