ios 关于tableview的复用问题,避免假复用

自从开始做ios开发,自己开发了很多客户端,也看到很多别人写的程序,发现很多人在做程序的时候走入了很多误区,比如tableview的复用,tableview的复用是为了解决大量数据的内存管理问题,优化软件的运行质量,但是因为问题只会影响到运行的质量问题,对于实现功能没有影响,因此这类问题在开发的时候很难被察觉,因此想提高软件质量的童鞋可以试试了解一下这个问题的优化方法。希望对大家有所帮助

了解软件的运行机理,以不变应万变:

假设第一个页面会显示8个Cell,因此需要创建8个Cell,每一个Cell都是独立的。创建完成这8个Cell以后,复用队列为空。然后当tableview开始滑动的时候,当第一个cell消失在屏幕上的时候,cell会被添加至复用队列中,此时复用队列为1个,此时这个复用队列中的cell的标识符为Cell自身的标识符,cell和标识符的关系有点类似字典,标识符对应Cell,通过标识符寻找Cell,当第二个Cell消失在屏幕中的时候,程序首先会根据第二个的Cell去复用队列寻找是否有和第二个标识符相同的标识符,如果有,则Cell被释放,复用队列不变,如果没有,则复用队列中添加第二个Cell,复用队列增加1个对象,以此类推...

同理,当第九个Cell需要在屏幕中出现的话,程序会从复用队列中根据标识符寻找有没有对应的Cell,如果没有,则会重新创建,如果有,则直接引用,不需要创建。

代码执行:


    //创建tableview
   
tableview=[[UITableViewalloc]init];
   
tableview.delegate=self;
   
tableview.dataSource=self;
   
tableview.tableFooterView=[UIViewnew];
    [
self.viewaddSubview:tableview];
    [
tableview mas_makeConstraints:^(MASConstraintMaker*make) {
        make.
edges.equalTo(self.view);
    }];


- ( CGFloat )tableView:( UITableView *)tableView heightForRowAtIndexPath:( NSIndexPath *)indexPath{
    return 40 ;
}

- (
NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section{
   
return 1 0 ;
}


- (
UITableViewCell *)tableView:( UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{
//根据不同的Cell的类型,创建不同的标识符
   
NSString *identifier1= @"MyCouponCell1" ;//标识符1
     NSString  *identifier2= @"MyCouponCell2" ;//标识符2
     NSString  *identifier3= @"MyCouponCell3" ;//标识符3
      MyCouponCell  *cell = [tableView dequeueReusableCellWithIdentifier :identifier1];//根据不同的标识符去复用队列中寻找是否有创建好的Cell
   
if (!cell) {
//复用队列中没有相同标识符的Cell,则去创建
        cell = [[
MyCouponCell alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier :identifier];
        cell.
selectionStyle = UITableViewCellSelectionStyleNone ;
    }


   //这里可以刷新Cell数据
//Code

    return cell;
}


//自定义Cell初始化方法

-( id )initWithStyle:( UITableViewCellStyle )style reuseIdentifier:( NSString *)reuseIdentifier{
   
self =[ super initWithStyle :style reuseIdentifier :reuseIdentifier];
   
if ( self ) {
        [
self createView ];
       
       
    }
   
return self ;
}
-(void)createView{

}

至于怎么区分cell是不是需要使用同一种标识符,作者这里一般根据Cell中的控件是否只是需要刷新数据,而里面的控件都是一样的来区分,现在还没有理论支持,如果大家有理论解释的话也可以向作者反馈,作者邮箱:1456661057@qq.com


  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值