2011-01-04 3 views
1

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

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 "[единица retainCount]);". Очень странно, что после viewDidLoad консоль отображает 3 строки «количество единиц измерения равно 2» (у меня есть 3 элемента на весь экран). Но когда я перетаскиваю экран, чтобы UITableView показывал следующий элемент, на консоли отображается «количество единиц 1». Когда вызывается метод [tableView reloadData], консоль отображает также «количество единиц измерения равно 1». Поэтому кажется, что UITableView автоматически выпустит источник данных. Вот почему я подсчитываю количество ссылок на память, равное 2, в противном случае произойдет высвобождение. Но стоимость в том, что память, занятая единицей, никогда не будет освобождена!

ответ

1

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

Абсолютный запас объекта не имеет смысла.

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

Для получения более подробной информации см. Memory Management Guidelines.


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

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

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

+0

Спасибо за ваш ответ, я сначала прочитаю руководства по управлению памятью. Но ситуация в том, что я всегда должен взять на себя ответственность за источник данных UITableView, что означает, что я не могу отправить метод авторекламы в источник данных. Но перед вызовом [tableView reloadData] я назначу ссылку источника данных на новый список/словарь. Это значит, что я должен сначала выпустить предыдущий источник данных вручную? – Shenjun

Смежные вопросы