iPhone: странная утечка - PullRequest
0 голосов
/ 04 июня 2011

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

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) Считывание данных из базы данных и сохраненных объектов в этом массиве * Список выбора 1019 *

if (sqlite3_prepare(database, sqlStatement, -1, &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) Я выпустил pickerList в dealloc() и установил его в ноль в viewDidUnload

Ответы [ 3 ]

4 голосов
/ 04 июня 2011

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

2 голосов
/ 04 июня 2011

Используйте метод синтезированного сеттера, чтобы установить массив в 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, вы потеряете указатель на исходный объект, поэтому не сможете его освободить, и у вас есть утечка.

2 голосов
/ 04 июня 2011

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

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

...