Как исправить утечку памяти? - PullRequest
5 голосов
/ 30 августа 2011

После выполнения длинного профильного теста я обнаружил, что в одном из моих файлов ".m" произошла утечка памяти в разделе viewdidload.я проверил и xcode выделил часть, где я инициализировал массивы выбора со значениями.моя программа использует средства выбора для ввода данных пользователем.и у меня есть 3 5 разных взглядов в моей программе.первая - это отказ от ответственности, вторая - меню, в котором пользователь может выбрать тип расчета, который он / она хочет сделать.каждый расчет требует определенных входных данных, которые пользователь вводит из средства выбора.напримеродно представление имеет 5 входов, которые обрабатываются 5 различными uipickers с отдельными массивами для хранения значений.эти массивы инициализируются значениями в методе viewdidload этого представления.вот что я нашел после запуска теста:

-viewDidLoad ...................................................................................................

instantiation

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

Ответы [ 3 ]

4 голосов
/ 30 августа 2011

Объекты в цели c имеют счет сохранения. Если этот счетчик хранения больше 0, когда объект выходит из области видимости (когда вы прекращаете его использовать), он протекает.

Следующие вещи увеличивают счет удержания

  • [[alloc] init]
  • новый
  • копия
  • [сохранить]
  • добавление объекта в массив
  • добавление объекта в качестве дочернего (например, просмотров)
  • Вероятно, есть и другие, но вы, похоже, не используете другие в своем коде

Следующее уменьшение счетчика удержания

  • [релиз]
  • удаление объекта из массива
  • если вы освободите массив, все его объекты будут освобождены

Вам следует пройтись по своему коду и убедиться, что каждое из сохранений или дополнений в массиве сопоставлено с соответствующим выпуском. (Вы можете освободить переменные-члены в методе dealloc).

РЕДАКТИРОВАТЬ: Джереми правильно указал, что мой ответ не

Как только вы добавляете объект в массив, он становится владельцем и освобождает объект, когда это будет сделано с ним. Все, что вам нужно сделать, это убедиться, что вы выпускаете все, что имеете, в соответствии с правилами управления памятью

Существуют также объекты автоматического выпуска, посмотрите на этот пример;

-(init){
    ...
    stagePickerArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 3; i++)
    {
        //this string is autoreleased, you don't have call release on it.
        //methods with the format [CLASS CLASSwithsomething] tend to be autorelease
        NSString *s = [NSString stringWithFormat:@"%d", i);
        [stagePickerArray addObject:s];
    }
    ...
 }

Я думаю, единственное, чего вам не хватает, - это вызова метода release в вашем методе dealloc

-(void) dealloc
{
    [stagepickerarray release];  //Do this for each of your arrays
    [super dealloc];
}
2 голосов
/ 30 августа 2011

Инструмент утечки скажет вам только, где вы разместили объекты, которые он считает утечками. Так, это говорит вам, например, что

NSString* answer = [NSString stringWithFormat: ...

выделяет объект, который никогда не освобождается. Теперь -stringWithFormat: дает вам объект, который вам не принадлежит , и вы, кажется, нигде не сохраняете его. Следовательно, вам не нужно выпускать его, поэтому он не может протекать сам по себе.

Это означает, что что-то еще, что вы делаете , должно сохранять, и вы никогда не выпускаете это что-то еще. Главный подозреваемый будет казаться stagePickerArray. Проверьте, что вы выпускаете stagePickerArray где-нибудь. Если он локальный для -viewDidLoad, он должен быть освобожден или автоматически освобожден до окончания этого метода. Если это переменная экземпляра, она должна быть освобождена в методе класса -dealloc.

0 голосов
/ 30 августа 2011

В Objective-C вам нужно позаботиться о сохранении количества выделенной памяти.Если вам это не нужно -> отпустите.

Всякий раз, когда вы выделяете объект, он возвращает объект со счетом удержания = 1.

При использовании удержания счетчик удерживания увеличивается, а при отпускании счет удержания уменьшается.Всякий раз, когда счет сохранения равен 0, объект будет уничтожен.

Поэтому, когда вы хотите использовать объект где-то еще, вам нужно его сохранить.Таким образом, вы должны убедиться, что объект не был удален после того, как другой «человек» (или что бы он ни использовал;)) вызывал release.

Это было очень очень очень краткое описание.Ознакомьтесь со следующим руководством Руководство по управлению памятью для iOS .

(Также вы хотите прочитать кое-что об ARC - автоматическом подсчете удержания - который впервые появился в iOS5!

...