dequeueReusableCellWithIdentifier после устранения утечек памяти - PullRequest
2 голосов
/ 09 февраля 2010

Я обнаружил утечку памяти с помощью инструментов в одном из моих TableView, точно в строке:

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

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

СейчасУ меня нет утечек памяти, но у моих UITableViewCell есть своя собственная жизнь: -)

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

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

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

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

[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, и он выбирает правильные данные в правильном разделе и строке ...

спасибо,

р.

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

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

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

и затем присвоение переменной ячейки чему-либо еще с помощью

cell = nibLoadCell;

Первая строка по сути не имеет никакого эффекта. Я предполагаю, что ячейка, загруженная из пера, все еще не имеет свой cellIdentifier установлен правильно. Смотри сюда: Загрузка многоразовой ячейки UITableViewCell с кончика

0 голосов
/ 10 февраля 2010

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

спасибо,

г.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...