UITableView проблема утечки памяти - PullRequest
1 голос
/ 04 января 2011

Привет всем У меня есть UITableView со списком элементов, извлеченных из sqllite. Но при визуализации представления возникает утечка памяти. Ниже приведен мой метод cellForRowAtIndexPath.

static NSString *CellIdentifier = @"BarListItemCell";


BarListItemViewCell *cell = (BarListItemViewCell *)[tableView 
                                  dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil) {
    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"BarListItemViewCell" owner:self options:nil];
    for (id cellObject in nib) {
        if ([cellObject isKindOfClass : [BarListItemViewCell class]]) {
            cell = (BarListItemViewCell *) cellObject;
            //break;
        }
    }
    NSString * key =   [keys objectAtIndex:[indexPath section]];
    NSDictionary * unit = [[barListDataSource objectForKey:key] objectAtIndex:[indexPath row]];

    NSLog(@"unit count is %d", [unit retainCount]);

    cell.name.text = [unit objectForKey:@"name"];
    cell.address.text = [unit objectForKey:@"address1"];
    cell.features.text = [unit objectForKey:@"features"];
    cell.logo.image = [UIImage imageWithData:[unit objectForKey:@"logo"]];  
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    //cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}    
return cell;

Вы можете увидеть строку "NSLog (@" счетчик единиц равен% d ", [unit retainCount]);". Очень странно, что после viewDidLoad консоль отображает 3 строки «количество единиц равно 2» (у меня есть 3 элемента на весь экран). Но когда я перетаскиваю экран, чтобы UITableView отображал следующий элемент, консоль отображает «количество единиц равно 1». Когда вызывается метод [tableView reloadData], консоль также отображает «количество единиц равно 1». Таким образом, кажется, что UITableView освободит источник данных автоматически. Вот почему я сохраняю счетчик ссылок на память равным единице, иначе произойдет чрезмерное освобождение. Но цена в том, что память, занятая устройством, никогда не будет освобождена!

1 Ответ

1 голос
/ 04 января 2011

Не вызывайте -retainCount.

Абсолютный счет сохранения объекта не имеет смысла.

Вы должны вызывать release ровно столько раз, сколько вы вызывали сохранение объекта,Не меньше (если вам не нравятся утечки) и, конечно же, больше нет (если вам не нравятся сбои).

См. Рекомендации по управлению памятью для получения полной информации.

Нет ничего странного в том, что счетчик остатков unit из того, что вы описываете.Ваш код, по-видимому, печатает счет сохранения объекта, который мог или не мог быть создан во время текущего прохода в цикле событий и, таким образом, мог быть сохранен / автоматически выпущен несколько раз.Или нет.Это не имеет значения.

Важно то, что показывает инструмент распределения.Вы видите срастание предметов со временем?Если да, то что это такое и что их удерживает (или не освобождает)?

Если вы это сделаете, то может быть так, что Анализ Heapshot окажется для вас полезным.

...