утечка памяти из метода в анализаторе - PullRequest
0 голосов
/ 26 марта 2012

Я близок к концу моего первого приложения, и я пытаюсь разобраться с ошибками и управлением памятью и все очистить.

В анализаторе в xcode следующая строка выглядит как «потенциальная утечка памяти»

- (NSMutableArray *) convertStringToASCIIMutableArray:(NSString *)stringIn {
    NSLog(@"call:convertStringToASCIIMutableArray");

    NSMutableArray *arrayOut = [[NSMutableArray alloc] initWithCapacity:stringIn.length];
    //NSMutableArray *arrayOut = [NSMutableArray arrayWithCapacity:stringIn.length];

    for (int i=0; i<stringIn.length; i++) {
        unichar ch = [stringIn characterAtIndex:i];
        if (ch > 96 && ch<123) ch = ch - 32; // convert to all capitals
        [arrayOut insertObject:[NSNumber numberWithChar:ch] atIndex:i];
    }
    return arrayOut;
}

Но когда я удаляю вызов alloc (как в закомментированной строке или с автоматическим выпуском)приложение вылетает.Кто-нибудь знает, что здесь происходит?

Ответы [ 3 ]

0 голосов
/ 26 марта 2012

Ничего не вижу здесь. Потенциальная утечка существует, потому что вы создаете изменяемый массив с использованием alloc-init и не освобождаете его после завершения метода. Поскольку вы возвращаете объект, я рекомендую вам создать версию для автоматического выпуска.

Теперь для сбоя приложения при использовании версии с автоматическим выпуском вам нужно будет посмотреть, где оно падает и что вы делаете, что привело к падению. Знаете ли вы о настройке точки останова при возникновении исключения? Если нет, следуйте этому, и код остановится на строке, когда произойдет сбой, чтобы вы могли отладить его:

  • Нажмите Command + 6 в xcode
  • Нажмите на кнопку + в левом нижнем углу
  • Выберите Добавить точку останова исключения
  • Установка параметров для всех исключений при броске и нажатии Готово.
0 голосов
/ 26 марта 2012

Ну, я действительно не решил мою проблему как таковую, но я преобразовал свой проект для компиляции с новым автоматическим подсчетом ссылок (ARC, спасибо @Kurt Revis и @Byron за то, что я привлек эту функцию к моему вниманию)

Чтобы конвертировать мой проект, я просто пошел, чтобы отредактировать> Refactor> Convert to Obj-C ARC. Затем я должен был соответствовать новым правилам управления памятью, как было предложено после выполнения «проверки», представленной в окне рефакторинга. По сути, мне пришлось удалить некоторые выпуски в моем методе dealloc, но в навигаторе проблем появилось несколько предупреждений, чтобы сказать мне, что делать.

ARC кажется великолепным. Более подробная информация доступна здесь:

Штеффен Иттерхейм

0 голосов
/ 26 марта 2012

«arrayOut» не выпускается автоматически, если вы находитесь в среде подсчета ссылок вручную.

Измените return arrayOut на return [arrayOut autorelease], и массив будет освобожден в конце текущего цикла выполнения.

...