1

カタのXcode Katasから、私は次のクラスになりました。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を使用しているかどうかを確認する方法がわかりませんが、そうでない場合は、オブジェクトを作成するすべての1行にメモリをリークさせる必要がありますか?

私はまた、releaseを呼び出すことは、ARCプロジェクトでは推奨されていないか、不要であると考えました。

答えて

3

私が最後に手動releaseを行う場合、あなたがARCを使用していないアナライザ

を満たしているようです。手動解除はARCでは禁止されていますが、これはコンパイルされません。ビルドの設定を確認してください。

+0

また、作成された他のすべてのオブジェクトが自動解放プールと呼ばれるものに追加されているため、他の行のメモリが漏れているわけではありません。生きていますが、あなたはそれらを所有していないので、それらを処分するのはあなたの仕事ではありません。これは一時的な値と戻り値のための便利なメカニズムです.ARCを最初に学習していても、その下の実装の詳細は残っています。 – Tommy

関連する問題