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