2010-02-09 3 views
2

Я нашел memoryleak с помощью инструментов в одном из моих TableView, точно на линии:dequeueReusableCellWithIdentifier после разрешения memoryleaks

[[NSBundle mainBundle] loadNibNamed:@"ShopListCell" owner:self options:NULL]; 

Идентификатор от кончика пера ShopListCell не было правильным с CellIdentifier.

Теперь у меня нет памяти-утечки, но мои UITableViewCells имеют свои собственные полужизни :-)

Я использую пользовательские UITableViewCell, и я покажу некоторые изображения и обновить некоторые этикетки от более NSFetchedResultsController ,

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

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

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

The [cell setNeedsDisplay]; перед возвратом ячейки не действует.

Вот код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"ShopListCell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 

[[NSBundle mainBundle] loadNibNamed:@"ShopListCell" owner:self options:NULL]; 
cell = nibLoadCell; 

cell.backgroundColor = [UIColor clearColor]; 

} 

// Set up the cell... 

Ingredient *ingredient = (Ingredient *)[fetchedResultsController objectAtIndexPath:indexPath]; 

NSLog(@"Section %d Row %d ingredient: %@", indexPath.section, indexPath.row,ingredient.name); // just to be sure it fetchs the correct data, and it does 


if([ingredient.isInListDone intValue] == 0) { 
cell.accessoryType = UITableViewCellAccessoryNone; 
[cellStateButton setSelected:NO]; 
cellImageInList = nil; 

} 
else { 
cell.accessoryType = UITableViewCellAccessoryCheckmark; 
[cellStateButton setSelected:YES]; 
cellImageInList.image = [UIImage imageNamed:@"underlined2.png"]; 

} 

cellLabelName.text = [ingredient name]; 

[cell setNeedsDisplay]; // this line has NO effect 

return cell; 
} 

Также я положил NSLog и выбирает правильные данные в правильном разделе и строки ...

спасибо,

р.

ответ

0

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

спасибо,

r.

+0

Что еще сообщение? Если вы имели в виду другой ответ, почему бы вам не принять его вместо своего? –

1

Вы создаете ячейку с

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 

, а затем присвоение переменной ячейки к чему-то еще с

cell = nibLoadCell; 

Первая линия по существу не имеет никакого эффекта. Я бы предположил, что ячейка, загруженная из ниба, по-прежнему не имеет корректного набора cellIdentifier. Посмотрите здесь: Loading a Reusable UITableViewCell from a Nib

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