Почему я получаю потенциальную утечку с ARC? - PullRequest
1 голос
/ 09 января 2012

После 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.

1 Ответ

3 голосов
/ 09 января 2012

Если в конце я выполнил инструкцию release, то, похоже, он удовлетворяет анализатору

Вы не используете ARC.Ручное освобождение запрещено с ARC, это не будет компилироваться.Проверьте настройки сборки.

...