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,可以通过这个标识进行缓存和重新;


UITableView性能优化,超实用

1. Cell重用    1.1>数据源方法优化 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtInd...
  • u011452278
  • u011452278
  • 2017年03月09日 15:29
  • 2492

UITableView的性能优化,提升列表滚动的流畅性

本篇博客目的是:总结UITableView性能优化方向,有些优化方式是我在开发中使用到过的,有些是没有用到过的,当中也有参考、查看很多大神的总结,这才有了本篇博客,仅供大家参考!...
  • qq_27484549
  • qq_27484549
  • 2015年09月20日 01:55
  • 2979

老生常谈之UITableView的性能优化

新的一年开始了,新的工作也开始了,刚过完年回来,感觉节后综合征还是很严重的~今早差点迟到。。。废话不多说,今天就来说说iOS最常用的控件-UITableView,基本用法就不多说了,大家应该都知道,当...
  • hmh007
  • hmh007
  • 2017年02月07日 11:11
  • 4305

ios开发笔记(三)—— UITableView的性能优化

ios应用程序在创建UITableView的时候会只在当前视图中chu'a
  • xiaoamani
  • xiaoamani
  • 2014年06月13日 10:33
  • 357

ORACLE SQL性能优化系列 (十)

31.       强制索引失效    如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) . 举例:   SELECT ENAMEFROM...
  • black_snail
  • black_snail
  • 2003年08月29日 07:40
  • 1117

iOS:关于UITableView的性能优化点

2015年最后一天,来总结一下iOS开发中遇到过的性能大坑,特别是UITableView这一用途非常广泛的控件。 一个UITableView为展示主题的app遇到的问题大概分为这几类:1、滚动卡顿。2...
  • trmbhs
  • trmbhs
  • 2015年12月31日 16:44
  • 603

iOS系列开发-UITableView性能优化

在我们的日常开发中,很多开发人员最常接触的就是UITableView或者UICollectionView来布局某些列表等界面. 这里我们就拿UITableView来作为说明内容 绝大部分的时候,一...
  • spicyShrimp
  • spicyShrimp
  • 2017年09月04日 10:00
  • 339

Android性能优化系列之布局优化

在Android开发中,UI布局可以说是每个App使用频率很高的,随着UI越来越多,布局的重复性、复杂度也会随之增长,这样使得UI布局的优化,显得至关重要,UI布局不慎,就会引起过度绘制,从而造成UI...
  • u012124438
  • u012124438
  • 2017年01月15日 22:20
  • 7379

Android性能优化系列---管理你的app内存(一)

Random-access memory(RAM)在任何软件开发环境都是稀有资源,在移动操作系统物理内存有限的情况下将显得更加珍贵.虽然Android的Dalvik虚拟机优化了内存回收机制,但我们也要...
  • xhmj12
  • xhmj12
  • 2016年02月03日 13:06
  • 404

UITableView 性能优化

缓存cell高度
  • caiyangjieto
  • caiyangjieto
  • 2014年12月31日 11:12
  • 569
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UItableView系列——性能优化
举报原因:
原因补充:

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