После StringCalculator ката из Xcode Katas я получил следующий класс.
@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
Все работает нормально, но когда я запускаю Analyze, я получаю потенциальную утечку памяти в первой строке метода. Если в конце я выполнил руководство release
, то, похоже, оно удовлетворит анализатор, но я не совсем понимаю, почему это происходит.
Чем создание mutableCopy
отличается от substringWithRange
, например? Я не уверен, как проверить, использую ли я ARC, но если нет, мне следует утечка памяти в каждой строке, где я создаю объект, верно?
Я также думал, что вызов release
отчасти устарел или не нужен в проектах ARC.