Ios TableViewCell don';不能重复使用

Ios TableViewCell don';不能重复使用,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我在表格视图中使用“自调整单元格大小”,插入单元格时使用“insertRowsAtIndexPaths:withRowAnimation:”单元格将在某个时候解除锁定,但我已为单元格设置了reuseIdentifier。当我滚动tableview时,单元格不会被释放 为什么要这样 这是我得到的代码: Class cls = [CWNSessionUtil cellClassForContent:content]; NSString *reuseIdentifier = [cls

我在表格视图中使用“自调整单元格大小”,插入单元格时使用“insertRowsAtIndexPaths:withRowAnimation:”单元格将在某个时候解除锁定,但我已为单元格设置了reuseIdentifier。当我滚动tableview时,单元格不会被释放

为什么要这样

这是我得到的代码:

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(带标识符:for:)
而不是
dequeueReusableCell(带标识符:)
,则可以获得更好的性能,因为在某些情况下,甚至不必重新绘制单元格

这个故事的寓意是:它们不会被解除分配,因为您希望它们被重用。为了重用,它们必须存在。您不必担心保留周期。

注意:如果问题是您希望在单元格进入重用队列时收到通知(因此它等待重用),请按照LGP的建议使用
prepareforeuse
。当一个单元格执行了一些繁重的操作,但它离开了屏幕时,可以使用该选项,因此您可以取消该操作以尽快释放资源


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

重新使用意味着当单元格离开屏幕时,它将不会被释放,但tableView将保留该标签以用于将要显示的行。因此,当您将一个单元出列时,将返回不再显示在屏幕上的现有单元实例,而不是实例化一个新的单元实例。这会提供更好的性能,因为对象创建是一个要求很高的操作

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

这个故事的寓意是:它们不会被解除分配,因为您希望它们被重用。为了重用,它们必须存在。您不必担心保留周期。

注意:如果问题是您希望在单元格进入重用队列时收到通知(因此它等待重用),请按照LGP的建议使用
prepareforeuse
。当一个单元格执行了一些繁重的操作,但它离开了屏幕时,可以使用该选项,因此您可以取消该操作以尽快释放资源


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

正如前面所说的,重复使用时单元格不会被释放。要在重用的单元格中执行清理,有另一种方法可用于
UITableViewCell
对象,称为
-(void)prepareforuse
将在从
dequeueReusableCellWithIdentifier:
方法返回单元格之前调用

如果重写
prepareforeuse
方法,请不要忘记调用超类方法


如前所述,重复使用时,电池不会被释放。要在重用的单元格中执行清理,有另一种方法可用于
UITableViewCell
对象,称为
-(void)prepareforuse
将在从
dequeueReusableCellWithIdentifier:
方法返回单元格之前调用

如果重写
prepareforeuse
方法,请不要忘记调用超类方法


请参见

您需要提供更多上下文。那代码是从哪里来的?这是您的
cellforrowatinexpath
方法吗?编辑您的问题以显示整个
cellForRowAtindexPath
方法,以及您的
InsertRowSatinExpaths:withRowAnimation:
方法。您需要解释该行的内容`Class cls=[CWNSessionUtil cellClassForContent:content];'以及它是如何适应的。也许可以详细说明你真正的问题是什么。如果你只是害怕循环,那么你就没什么好担心的了,看看我的答案。如果要在重新使用单元格时执行一些特殊操作,请参见LGP建议的
prepareforuse
。如果您还担心其他问题,那么给我们一些上下文。听起来他似乎看到他的单元格有时会被释放,这很奇怪,因为只要表视图仍然存在,就应该将它们放入重用队列中。不过我们需要更好的解释,因为很难根据“听起来像”给出有意义的答案。首先,
if(!cell)
是可疑的。。在Swift
dequeueReusableCell(with identifier:)
中,不返回可选的,因此我认为这永远不会发生。但是
Class cls=[CWNSessionUtil cellClassForContent:content]可能与此有关,然后他手动创建单元格,如果发生这种情况,这将解释为什么有时会取消分配-他手动创建。您需要提供更多上下文。那代码是从哪里来的?那是你的
手机吗