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