UItableView系列——性能优化

原创 2015年11月19日 15:01:27

前面已经说过UITableView中的单元格cell是在显示到用户可视区域后创建的,那么如果用户往下滚动就会继续创建显示在屏幕上的单元格,如果用户向上滚动返回到查看过的内容时同样会重新创建之前已经创建过的单元格。如此一来即使UITableView的内容不是太多,如果用户反复的上下滚动,内存也会瞬间飙升,更何况很多时候UITableView的内容是很多的(例如微博展示列表,基本向下滚动是没有底限的)。

前面一节中我们曾经提到过如何优化UIScrollView,当时就是利用有限的UIImageView动态切换其内容来尽可能减少资源占用。同样的,在UITableView中也可以采用类似的方式,只是这时我们不是在滚动到指定位置后更改滚动的位置而是要将当前没有显示的Cell重新显示在将要显示的Cell的位置然后更新其内容。原因就是UITableView中的Cell结构布局可能是不同的,通过重新定位是不可取的,而是需要重用已经不再界面显示的已创建过的Cell。

当然,听起来这么做比较复杂,其实实现起来很简单,因为UITableView已经为我们实现了这种机制。在UITableView内部有一个缓存池,初始化时使用initWithStyle:(UITableViewCellStyle) reuseIdentifier:(NSString *)方法指定一个可重用标识,就可以将这个cell放到缓存池。然后在使用时使用指定的标识去缓存池中取得对应的cell然后修改cell内容即可。

#pragma mark返回每行的单元格
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    //NSIndexPath是一个对象,记录了组和行信息
    NSLog(@"生成单元格(组:%i,行%i)",indexPath.section,indexPath.row);
    KCContactGroup *group=_contacts[indexPath.section];
    KCContact *contact=group.contacts[indexPath.row];
    
    //由于此方法调用十分频繁,cell的标示声明成静态变量有利于性能优化
    static NSString *cellIdentifier=@"UITableViewCellIdentifierKey1";
    //首先根据标识去缓存池取
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    //如果缓存池没有到则重新创建并放到缓存池中
    if(!cell){
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:cellIdentifier];
    }
    
    cell.textLabel.text=[contact getName];
    cell.detailTextLabel.text=contact.phoneNumber;
    NSLog(@"cell:%@",cell);
    return cell;
}

上面的代码中已经打印了cell的地址,如果大家运行测试上下滚动UITableView会发现滚动时创建的cell地址是初始化时已经创建的。

这里再次给大家强调两点:

  1. -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)方法调用很频繁,无论是初始化、上下滚动、刷新都会调用此方法,所有在这里执行的操作一定要注意性能;
  2. 可重用标识可以有多个,如果在UITableView中有多类结构不同的Cell,可以通过这个标识进行缓存和重新;


相关文章推荐

TableView性能优化——动态cell适应工具(UITableView+FDTemplateLayoutCell)

———————前前言———————————————————— 本文会主要阐述主流的cell高度返回方式、并以原文为框架进行了一些扩展补充。文章最后、列出了UITableView+FDTempla...

iOS开发——项目实战总结&UITableView性能优化与卡顿问题

标签: UITableView性能优化与卡顿问题 本文转载出处:http://www.mamicode.com/info-detail-1125512.html 1.最常用的就是cell...

UITableView——reloadData与reloadSection性能比较

周五上午,测试,有个很奇怪的bug:每次reset模拟器后,第一次进入个人资料界面,首诊记录数据展示不对,第二次进入数据展示都是正确的。这个患者其实有首诊记录,但当时查看代码很久,一直没找到问题所在。...
  • iosswift
  • iosswift
  • 2015年11月25日 19:54
  • 13741

UItableView系列——最重要的部分UItableViewCell

1.自带的UITableViewCell UITableViewCell是构建一个UITableView的基础,在UITableViewCell内部有一个UIView控件作为其他内容的容器,它上...

IOS系列——UItableview的基础使用

在IOS中,众所周知,UiTableview使用的时候很多,而且知识点也很多,作为一个菜鸟来讲,首先要先知道基础的使用方法 Uitableview的使用,要实现它的协议和数据源,就是在.h文件中实现 ...

Android应用性能优化系列视图篇——恼人的分割线留白解决之道

相信很多一线的开发者都遇到过分割线,作为视觉设计中的最常用的元素之一,虽然简单易画,但在布局排版中往往却起影响视图层级结构的重要作用。往往由于一道小小的分割线,不仅在layout中多个数个视图,而且容...

Android性能优化系列——VSYNC

概念 VSYNC,vertical synchronization Refresh Rate 屏幕一秒钟刷新的次数,由硬件决定,单位Hz,一般是60Hz Frame Rate GPU在一秒内绘制的帧数...
  • xu_fu
  • xu_fu
  • 2015年04月11日 20:11
  • 2479

擎天哥as3教程系列第二回——性能优化

所谓性能优化主要是让游戏loading和运行的时候不卡。 一  优化fla导出的swf的体积? 1,  在flash中,舞台上的元件最多,生成的swf越大,库里面有连接名的元件越多,swf越大。当...

Android性能优化系列——Performance Tips

本文列出的优化技巧主要是一些微小的性能提升,可能不会给你的程序性能改善产生显著的效果。因为程序的整体性能仍然主要取决于程序的业务逻辑设计、代码的...
  • xhmj12
  • xhmj12
  • 2016年02月21日 10:16
  • 357
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UItableView系列——性能优化
举报原因:
原因补充:

(最多只允许输入30个字)