TableViewCell不会重用

时间:2018-01-08 12:40:41

标签: ios objective-c uitableview

我使用" Self Sizing Cells"在我的tableview中,插入单元格使用' insertRowsAtIndexPaths:withRowAnimation:'细胞将在某个时候被释放,但我已经为细胞设置了reuseIdentifier。当我滚动桌面视图时,细胞不会被释放。

为什么这样?

它的代码我得到了细胞:

Class cls = [CWNSessionUtil cellClassForContent:content];
        NSString *reuseIdentifier = [cls reuseIdentifier];

        cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
        if(!cell)
        {
            cell = [[cls alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
        }


+(Class)cellClassForContent:(id)content{
    Class cls;

    if([content isKindOfClass:[MessageEntity class]])
    {
        CubeMessageType type = [((MessageEntity *)content) type];
        switch (type) {
            case CubeMessageTypeFile:
                cls = [CWNFileMessageCell class];
                break;
            case CubeMessageTypeImage:
                cls = [CWNImageMessageCell class];
                break;
            case CubeMessageTypeVideoClip:
                cls = [CWNVideoMessageCell class];
                break;
            case CubeMessageTypeVoiceClip:
                cls = [CWNAudioMessageCell class];
                break;
            case CubeMessageTypeCustom:
                cls = [self cellClassForCustomMessage:content];
                break;
            default:
                cls = [CWNTextMessageCell class];
                break;
        }

    }
    else if([content isKindOfClass:[NSString class]])
    {
        cls = [CWNTipCell class];
    }
    else if([content isKindOfClass:[NSNumber class]])
    {
        cls = [CWNTimeCell class];
    }
    else
    {
        cls = [CWNTipCell class];
    }

    return cls;
}

2 个答案:

答案 0 :(得分:2)

重用意味着当单元格离开屏幕时,它不会被取消分配,但tableView将保留它用于那些将要呈现的行。因此,当您使单元格出列时,不会实例化新的单元格实例,而是返回不再显示在屏幕上的现有单元格实例。这提供了更好的性能,因为对象创建是一项非常苛刻的操作。

此外,如果您使用dequeueReusableCell(withIdentifier:for:)代替dequeueReusableCell(withIdentifier:),您可以获得更好的效果,因为在某些情况下,细胞甚至不必重新绘制。

故事的道德:他们没有被解除分配,因为你希望它们被重用。为了重复使用,它们必须存在。您不必担心保留周期。

P.S。:如果问题是您希望在单元进入重用队列时收到通知(因此它等待重用),请使用prepareForReuse作为LGP建议。这可以用于一个单元格进行一些重量级操作但它离开屏幕的情况,因此您可以取消操作以尽快释放资源。

但是,在大多数情况下,您可以在cellForRow中从头开始配置单元格 - 请记住,除非您在prepareForReuse中清除了单元格的内容,否则必须确保你重置了所有的内容。例如,如果您有一个显示可选字符串的标签,那么当在没有此字符串的新行中重复使用时,该标签将被设置为旧标签。

答案 1 :(得分:0)

如前所述,细胞在重复使用时不会被释放。要在重用的单元格中执行清理,可以使用另一种可用的UITableViewCell对象方法,称为-(void)prepareForReuse;,它将在从dequeueReusableCellWithIdentifier:方法返回单元格之前调用。 / p>

如果覆盖prepareForReuse方法,请不要忘记调用超类方法。

请参阅https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse?language=objc