我使用" 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;
}
答案 0 :(得分:2)
重用意味着当单元格离开屏幕时,它不会被取消分配,但tableView将保留它用于那些将要呈现的行。因此,当您使单元格出列时,不会实例化新的单元格实例,而是返回不再显示在屏幕上的现有单元格实例。这提供了更好的性能,因为对象创建是一项非常苛刻的操作。
此外,如果您使用dequeueReusableCell(withIdentifier:for:)
代替dequeueReusableCell(withIdentifier:)
,您可以获得更好的效果,因为在某些情况下,细胞甚至不必重新绘制。
故事的道德:他们没有被解除分配,因为你希望它们被重用。为了重复使用,它们必须存在。您不必担心保留周期。
P.S。:如果问题是您希望在单元进入重用队列时收到通知(因此它等待重用),请使用prepareForReuse
作为LGP建议。这可以用于一个单元格进行一些重量级操作但它离开屏幕的情况,因此您可以取消操作以尽快释放资源。
但是,在大多数情况下,您可以在cellForRow
中从头开始配置单元格 - 请记住,除非您在prepareForReuse
中清除了单元格的内容,否则必须确保你重置了所有的内容。例如,如果您有一个显示可选字符串的标签,那么当在没有此字符串的新行中重复使用时,该标签将被设置为旧标签。
答案 1 :(得分:0)
如前所述,细胞在重复使用时不会被释放。要在重用的单元格中执行清理,可以使用另一种可用的UITableViewCell
对象方法,称为-(void)prepareForReuse;
,它将在从dequeueReusableCellWithIdentifier:
方法返回单元格之前调用。 / p>
如果覆盖prepareForReuse
方法,请不要忘记调用超类方法。