UITableView-循环利用,优化原理
当我们在项目中用到UITableView时,如果没有做优化处理,只是简单的实现功能代码。当我们有上百条tableviewcell的时候,我们滑动的非常快的时候会非常消耗内存,当然苹果公司不会让我们这样干,苹果公司会在程序启动加载页面的时候。只开辟出现在页面上的tableviewcell,剩下的就需要你滑动到该条才加载到内存中去,划出的UITableviewcell则放入tableview内存池中,当下面需要这个类型的tableviewcell时就加载进去。
UITableViewCell对象的重用原理:
iOS设备的内存有限,如果用UITableView显示成千上万条数据,就需要成千上万个UITableViewCell对象的话,那将会耗尽iOS设备的内存。要解决该问题,需要重用UITableViewCell对象;
重用原理:当滚动列表时,部分UITableViewCell会移出窗口,UITableView会将窗口外的UITableViewCell放入一个对象池中,等待重用。当UITableView要求dataSource返回UITableViewCell时,dataSource会先查看这个对象池,如果池中有未使用的UITableViewCell,dataSource会用新的数据配置这个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;