iPhone: Странная утечка

#iphone #memory-leaks

#iPhone #утечки памяти

Вопрос:

Хорошо, приведенная ниже проблема решена, но теперь она создает утечку для этого блока

 NSMutableArray *tempRowArray=[[NSMutableArray alloc] init];
    [tempRowArray addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]];
    [pickerList addObject:tempRowArray];
    [tempRowArray release];
  

для tempRowArray

ах, я запутался в этих проблемах с памятью.

Решено: Привет,

Не могли бы вы, пожалуйста, помочь мне в этом, у меня следующее условие

1) Объявил массив в .h файле.
2) Создал свойство и синтезировал его
3) В viewWillAppear выделенной ему памяти

 pickerList = [[NSMutableArray alloc] init];
  

4) Считайте данные из базы данных и сохраненные объекты в этом массиве

 if (sqlite3_prepare(database, sqlStatement, -1, amp;compiledStatement, NULL) == SQLITE_OK) {

    while (sqlite3_step(compiledStatement) == SQLITE_ROW) {

        NSMutableArray *tempRowArray=[[NSMutableArray alloc] init];
        [tempRowArray addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]];
        [pickerList addObject:tempRowArray];
        [tempRowArray release];
    }
}
  

список выбора отображается как утечка памяти
и приложение в конечном итоге выходит из строя через некоторое время, пожалуйста, помогите мне избавиться от этого

5) Я выпустил список выбора в dealloc() и установил для него значение nil в viewDidUnload

Комментарии:

1. Когда вы устанавливаете значение nil в viewDidUnload, используете ли вы self.pickerList = nil;? Это отличается от списка выбора = ноль;

Ответ №1:

Каждый раз, когда появляется представление, вы выделяете pickerList . Выделите его в viewDidLoad , а затем отпустите в viewDidUnload .

Ответ №2:

В viewWillAppear вы выделяете память. В случае, если вы переключаетесь на этот контроллер представления и обратно, ваш viewWillAppear будет вызываться, и вы будете выделять память снова и снова.

Сделайте это в viewDidLoad , а также используйте его свойство при его выделении.

Ответ №3:

Используйте метод synthesized setter для установки массива в viewDidLoad

 self.pickerList=[NSMutableArray array];
  

И установите ее на nil в viewDidUnload

 self.pickerList = nil;
  

Причина, по которой вы получаете утечку, заключается в том, что вы, вероятно, вызываете pickerList = nil в viewDidUnload

Есть разница между pickerList = something и self.pickerList = something . В первом случае вы устанавливаете значение напрямую, но если вы используете вторую версию (и вы объявили @property (retain) NSMutableArray *pickerList , что метод @synthesized setter сохранит новое значение и освободит старое значение.

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

Комментарии:

1. Это не источник утечки. Это выбор стиля.

2. @PengOne Верно — но таким образом, при загрузке представления он освободит ранее выделенный изменяемый массив и заменит его новым. Которая останавливает утечку.

3. @Abizern Touche. Возможно, было бы неплохо добавить это объяснение к вашему ответу, чтобы он (и будущие поколения) поняли источник утечки и как это затыкает его.

4. Абизем прав. Его заявление, когда оно будет размещено в поле зрения, появится, утечки не произойдет. Но нет необходимости выделять снова и снова. Просмотр загрузки — лучшее место.

5. @PengOne, @Abizern, Так что этот ответ заслуживает 1.