解决内存泄漏后dequeueReusableCellWithIdentifier

时间:2010-02-09 15:41:34

标签: iphone uitableview

我在我的一个TableView中找到了一个使用乐器的记忆漏洞,正是在这一行:

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

使用CellIdentifier,nib ShopListCell中的标识符不正确。

现在,我没有内存泄漏,但我的UITableViewCells有自己的生命: - )

我正在使用自定义UITableViewCell,我会显示一些图像并更新NSFetchedResultsController中的一些标签。

当用户点击一行时,我会更新模型,因此单元格始终显示真实数据,但是,它显示的不是真实数据,而是显示其他一些单元格。

我怀疑这是因为我正在重复使用单元格,但是在返回之前我对单元格进行了所有修改,因此我希望始终显示正确的数据。

在修复内存泄漏之前这是完美的,我总是使用一个新的单元格,现在我正在重用它们但是有很多问题。

[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 个答案:

答案 0 :(得分:1)

您正在使用

创建一个单元格
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];

然后使用

将单元格变量分配给其他内容
cell = nibLoadCell;

第一行基本上没有效果。我猜想从笔尖加载的单元格仍然没有正确设置其cellIdentifier。看这里: Loading a Reusable UITableViewCell from a Nib

答案 1 :(得分:0)

阅读完另一篇文章后,最后我用自定义单元格设置了一个新类,现在按预期工作了,没有内存泄漏!

感谢,