优化原理之UITableView - 循环利用

UITableView-循环利用,优化原理

当我们在项目中用到UITableView时,如果没有做优化处理,只是简单的实现功能代码。当我们有上百条tableviewcell的时候,我们滑动的非常快的时候会非常消耗内存,当然苹果公司不会让我们这样干,苹果公司会在程序启动加载页面的时候。只开辟出现在页面上的tableviewcell,剩下的就需要你滑动到该条才加载到内存中去,划出的UITableviewcell则放入tableview内存池中,当下面需要这个类型的tableviewcell时就加载进去。

UITableViewCell对象的重用原理:

iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象;

重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCelldataSource会用新的数据配置这个UITableViewCell,然后返回给UITableView,重新显示到窗口中,从而避免创建新对象;

还有一个非常重要的问题:有时候需要自定义UITableViewCell(用一个子类继承UITableViewCell),而且每一行用的不一定是同一种UITableViewCell(如短信聊天布局),所以一个UITableView可能拥有不同类型的UITableViewCell,对象池中也会有很多不同类型的UITableViewCell,那么UITableView在重用UITableViewCell时可能会得到错误类型的UITableViewCell;

解决方案:UITableViewCell有个NSString *reuseIdentifier属性,可以在初始化UITableViewCell的时候传入一个特定的字符串标识来设置reuseIdentifier(一般用UITableViewCell的类名)。当UITableView要求dataSource返回UITableViewCell时,先通过一个字符串标识到对象池中查找对应类型的UITableViewCell对象,如果有,就重用,如果没有,就传入这个字符串标识来初始化一个UITableViewCell对象;

 

//注意此处生成的cell的类型ci类型,ci可以随便写!

UITableViewCell *tableViewCell = [tableViewdequeueReusableCellWithIdentifier:@"ci"];

//这里我循环得到70行,注意内存哦!!!!

 NSString *str =[NSString stringWithFormat:@"我是cell——————%d",indexPath.row];

if(tableViewCell == nil) {

    //tableview内存池,当有不用的tableviewcell划出屏幕时,就被回收到内存池中,然后,下面的tableviewcell从下面划出时是需要开辟tableviewcell的,所以以下tableviewcell先要判断类型reuseIdentifier是不是呵上面的tableviewcell相同,就好像一个病人要补充血液要找到自己合适的血型一样,如果相符就使用内存池里的,如果不相符系统重新开辟一个此种类型的tableviewcell 所以下面打印的时候地址是循环相同的,0---3都是不一样的地址,然后才是重复0---3的地址!!!!

    tableViewCell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"ci"];

}

NSLog(@"%d------%p",indexPath.row,tableViewCell);

return tableViewCell;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值