#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.