ios - UITableViewCell不要重复使用

原文 标签 ios objective-c uitableview

我在表格视图中使用“自定义大小的单元格”,而在插入单元格时使用“ 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;
}

最佳答案

重用意味着当单元格离开屏幕时,它不会被释放,但是tableView将保留它以将其用于将要显示的那些行。因此,当您使一个单元出队时,不是实例化一个新的单元实例,而是返回不再显示在屏幕上的现有单元实例。这会带来更好的性能,因为对象创建是一项非常艰巨的操作。

而且,如果使用dequeueReusableCell(withIdentifier:for:)而不是dequeueReusableCell(withIdentifier:),则可以获得更好的性能,因为在某些情况下,甚至不必重新绘制单元格。

故事的寓意:它们不会被释放,因为您希望它们被重用。为了重用,它们必须存在。您不必担心保留周期。

附注:如果问题是您希望在单元进入重用队列时收到通知(因此它等待重用),请按照LGP建议使用prepareForReuse。如果单元格进行了一些繁重的操作但它不在屏幕上,则可以使用该方法,因此您可以取消该操作以尽快释放资源。

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

关于ios - UITableViewCell不要重复使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48150529/

相关文章:

objective-c - 如何通过NSTask运行“清除”命令?

ios - 使用自动布局更新 Collection View 高度以适合表 View 单元格中的所有单元格

ios - 如何为每个表添加具有不同重复次数的多个TableViewCell

iOS 构建/ipa 创建不再从命令行工作

ios - iOS,随机滑动动画

objective-c - NSException当重复NSTask

ios - 自定义UIView并在访问属性时崩溃

iOS 向表格部分标题添加约束

ios - 如何在Swift中使用一个按钮从多个UITextView保存文本

ios - 在applicationWillTerminate中发送请求