You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在UITableView中复用动态原型单元格以节省内存?

解决UITableView单元格复用问题的可行方案

看起来你遇到的单元格复用问题,大概率是几个关键步骤没落实到位,我帮你一步步排查和修正:

第一步:确认Storyboard原型单元格的配置

首先要确保你在Storyboard里的操作完全正确:

  • 选中你的原型单元格,在右侧Identity Inspector面板中,把Reuse Identifier准确设置为Test(和代码里的字符串完全一致,大小写敏感);
  • 同时确认这个原型单元格的类已经指定为mytesttableviewcell,避免因类型不匹配导致的异常。

第二步:修正cellForRowAtIndexPath:方法

你的现有代码缺少对cell为nil情况的兼容(虽然iOS 6及以后,dequeueReusableCellWithIdentifier:会自动创建新cell,但为了兼容更早版本或确保万无一失,最好补上判断),另外要确保单元格内的控件(txt1和txt2)已正确关联:

修正后的代码如下:

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    // 尝试从复用队列获取cell
    mytesttableviewcell *cell = [self.tbl dequeueReusableCellWithIdentifier:@"Test"];
    
    // 如果没有可复用的cell,手动创建(兼容iOS 5及更早版本,或未通过Storyboard注册的场景)
    if (!cell) {
        // 纯代码创建cell的写法
        cell = [[mytesttableviewcell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Test"];
        // 如果是用XIB创建的cell,替换成下面这行:
        // cell = [[[NSBundle mainBundle] loadNibNamed:@"mytesttableviewcell" owner:self options:nil] firstObject];
    }
    
    // 设置cell内容
    cell.txt1.text = @"1234567890";
    cell.txt2.text = @"1234567890";
    
    return cell;
}

额外注意事项

  • 若你的mytesttableviewcell是通过XIB文件创建的(而非Storyboard原型),需要在viewDidLoad中提前注册XIB:
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.tbl registerNib:[UINib nibWithNibName:@"mytesttableviewcell" bundle:nil] forCellReuseIdentifier:@"Test"];
    }
    
  • 若为纯代码编写的cell类(无XIB),则在viewDidLoad中注册类:
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.tbl registerClass:[mytesttableviewcell class] forCellReuseIdentifier:@"Test"];
    }
    
  • 务必确认txt1和txt2已通过IBOutlet正确关联到mytesttableviewcell类,否则设置文本无效果,可能会让你误以为复用未生效。

按以上步骤调整后,单元格复用机制就能正常工作了,复用队列会自动管理滑出屏幕的cell,避免重复创建新实例,从而达到节省内存的目的。

内容的提问来源于stack exchange,提问作者Rajan M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:32:30