我的印象是,在应用程序崩溃之前,表视图单元格从未被释放,因为您可以重新使用它们。但是当我分析我的表视图时,我意识到在我的自定义单元格上调用了dealloc。什么是dealloc的自定义单元格,我可以阻止它吗?
答案 0 :(得分:4)
使用常见的“重用”模式:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellId = @"Foo";
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId]
autorelease];
}
// update the cell content
return cell;
}
表格视图根据需要创建尽可能多的单元格以填充其框架高度 当从屏幕上消失时,它们将从视图中删除并放入重用队列,因此不会被解除分配。
当tableView被释放时,所有单元格都被释放,并且当行数发生变化时,可能会释放一些单元格(比如说之前有20个单元格,更新后只有2个单元格)。
您可能想要摆脱细胞重用,但是您将失去所有背后的魔力以保持较低的内存占用并获得平滑的滚动体验。
答案 1 :(得分:1)
dequeueReusableCellWithIdentifier:
选择器的语义是不透明的(据我所知)。如果要完全控制表视图单元格,请不要使用该选择器来获取单元格:只需构造一个新单元格或使用自己的池进行重用。
答案 2 :(得分:0)
表视图根据需要创建和删除单元格。这是为了允许滚动非常长的列表而不将它们全部存储在内存中。几乎无限的可滚动列表是可能的。保留表视图生命周期的自定义单元格的便捷方法是在创建时将它们添加到可变数组中。在创建之前,查看数组以查看它是否已存在。