如何清除缓存的UITableViewCell

7 uitableview reuseidentifier ios

有没有人有关于如何清除缓存的建议UITableViewCell

我想用reuseIdentifier缓存这些单元格.但是,有时我需要删除或修改某些表行.我希望reloadData在行更改后调用.

现在,dequeueReusableCellWithIdentifier始终返回之前的缓存(过时)条目.如何指示缓存是陈旧的并且需要清除?

Lil*_*ard 7

我不确定你为什么要首先清除细胞.每次出列单元格时,都需要重新设置需要显示的数据.缓存只会阻止您每次都必须设置任何不变的属性.但是必须设置正在显示的实际数据,即使之前缓存了单元格.

请注意,对于所有相同类型的单元格,您的重用标识符应该是相同的.如果您正在做一些愚蠢的事情,比如根据相关行计算标识符,那么您做错了.

你的代码看起来应该是这样的

- (UITableViewCell *)tableView:(UITableView *)view cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *identifier = @"CellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        // no cached cell, create a new one here
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
        // set any properties that all such cells should share, such as accessory, or text color
    }
    // set data for this particular cell
    cell.textLabel.text = @"foo";
    return cell;
}

在该示例中,请注意我每次都是如何始终为单元设置数据,并且所有单元共享相同的标识符.如果您遵循这种模式,您根本没有理由尝试"清除"您的单元格,因为任何旧数据都会被覆盖.如果您有多种类型的单元格,在这种情况下您可能希望使用多个标识符,但每个单元格类型仍然是1个标识符.

  • @Jesse Armand:为每一行使用不同的标识符是泄漏每个单元格的好方法.当然,这些不是"真正的"泄漏,因为它们会在表本身发生时消失,但是你正在积极地缓存永远不会再次使用的对象.您只需更加智能地在重复使用单元格时取消缩略图加载,或者在准备好显示缩略图时检查单元格是否仍然代表同一对象. (2认同)
  • @Yar:如果你没有在单元格之间共享你的标识符,那么你就是故意"泄漏"你创建的每个单元格(我把它放在引号中,因为只要表格还活着它就会泄漏).如果你没有使用`dequeue`那么你又会"泄漏"你创造的每一个细胞.你没有保存*one*alloc/init,你正在保存*EVERY SINGLE*alloc/init超过前7个(左右,取决于单元格高度和表高度,基本上只是`numCellsVisible + 2`). (2认同)

Gia*_*iao 0

应使用该消息清除以前使用单元时产生的旧数据prepareForReuse。当单元出队时,此消息会在从 中返回之前发送到该单元dequeueReusableCellWithIdentifier:

  • 我认为你不明白Giao的回答。他根本没有建议你做什么。“prepareForReuse:”方法会在每个单元格出队时发送到每个单元格,然后再将其交给您。这是自动发生的事情,只有当您实现自己的“UITableViewCell”子类时,您才关心它。 (2认同)