iOS亲测UITableView重用机制,用事实说话。

UITableView重用机制主要是依靠reuseIdentifier来辨别,以此来建立一个队列,将建好的Cell放入队列中,之后直接使用队列中的Cell,不再新建,极大的提升了TableView的重用性,同时使列表滑动时不会出现卡顿现象。TableView基本上是新手必学,我第一个熟练掌握的控件,及使用得最多的就是TableVIew,重用机制有很多地方很多人都讲过,不过我还是要从自己的角度来再次BB下。由于列表内容太长了,不方便直接在界面上截图,所以只把打印的数据拿出来。

1、重用机制Cell是如何新建的?

很多人以为Cell在新建的时候只新建一个,其他的都重复使用那一个,但事实上并不是这样的,新建多少个Cell,并加入重用队列是取决于初始化时屏幕中能容纳多少个Cell,(5S模拟器测试)经测试Cell高44时,新建14个Cell。Cell高120时,count:6,新建6个Cell。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static int count = 0;
    static NSString *celleIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:celleIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:celleIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
        count ++;
    }
    if (indexPath.row < 10) {
        cell.textLabel.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];

    NSLog(@"count:%d,cellheight:%f",count,cell.frame.size.height);
    return cell;
}

2、Cell重用时是如何取出来的?

在使用120高度的Cell时,重用队列中将只有6个存储的Cell,在下方代码中到第6个Cell,即textLabel == 6时 已用开始使用重用队列中的Cell,由打印的数据可知,init textLabel为0,这使用的是第一个存入的队列Cell,textLabel == 7时, init textLabel为1,使用的是存入的第二个Cell,一直到使用第六个完成一轮后再重新使用第一个存入的Cell,由此可以推断,Cell重用时是秉承先进先出的原则,循环使用。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static int count = 0;
    static NSString *celleIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:celleIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:celleIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
        count ++;
    }
    NSLog(@"init textLabel:%@",cell.textLabel.text);
    if (indexPath.row < 10) {
        cell.textLabel.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
    }
    NSLog(@"count:%d,textLabel:%@",count,cell.textLabel.text);
    return cell;
}

3、reuseIdentifier的作用?

在加载第11个Cell的时候开始,Cell的celleIdentifier换成了@"cell2",并且将第11个Cell的textLabel内容换乘@"this is 20",根据截图可知,由于更换了celleIdentifier,在第11个Cell加载时是没有init textLabel的,并且count开始自增直至12,说明使用新的celleIdentifier使tableview重新建了一个队列并且放入了6个新的Cell,并且在6个一轮之后重用了,新队列里的Cell。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static int count = 0;
    static NSString *celleIdentifier = @"Cell";
    if (indexPath.row > 10) {
        celleIdentifier = @"Cell2";
    }
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:celleIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:celleIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
        count ++;
    }
    NSLog(@"init textLabel:%@",cell.textLabel.text);
    if (indexPath.row < 10) {
        cell.textLabel.text = [NSString stringWithFormat:@"%ld",(long)indexPath.row];
    }else if (indexPath.row == 11){
        cell.textLabel.text = @"this is 20";
    }
    NSLog(@"count:%d,textLabel:%@",count,cell.textLabel.text);
    return cell;
}

4、为什么使用重用机制后我的数据乱掉了?

在解释第三点时,在第11个Cell之后textLabel一直显示的是null,这是因为我没有在重用后,对这个Cell进行操作,一般在使用重用后,都需要对Cell的数据进行处理。如果没有处理的话,一种情况就像上面截图一样,由于重用队列里面的Cell的textLabel就是没有值的,取出来之后还是不进行操作,即为null。还有一种情况是打印出this is 20的这种情况,因为重用队列里面的Celld的textLabel里面有值,取出重用后不进行操作的话就会使用之前队列里Cell的textLabel这个值,所以后面有好几个重用Cell2队列中第一个存入的Cell时,打印出来的数据也为this
is 20。

总结:不同的reuseIdentifier代表了不同的队列,重用时按队列顺序先进先出,一轮之后再重新从第一个开始重用。

时间: 2024-10-07 03:05:18

iOS亲测UITableView重用机制,用事实说话。的相关文章

IOS开发—UITableView重用机制的理解

引言 对于一个UITableView而言,可能需要显示成百上千个Cell,如果每个cell都单独创建的话,会消耗很大的内存.为了避免这种情况,重用机制就诞生了. 假设某个UITableView有100个数据需要显示,即需要100个Cell,然而屏幕中最多只能一次性显示10个Cell,那么有一个办法可以不用创建100cell,而只需要创建11(10+1)个. 理解 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowA

UI之UItableView重用机制的性能问题

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

iOS-cell的重用机制

对于像我们这样的初学者来说,cell重用机制是很难理解的内容,所以我们不一定非得理解,会用就行. cell的重用机制:当我们使用tableView时,系统只会创建屏幕中显示的cell的个数+1,当cell滑出可视范围时,会将此cell放出重用池,当有新的cell滑进可视范围时,先到重用池里去找,找不到就创建,找得到就直接用,所以会用串(有时候不会串<cell的个数小于3>) 防止用串的方法:1.设置标签2.不用重用池,直接创建3.拿出来用之前,清空原内容 一.设置标签(这是最常用的) cell

iOS-UITableView重用机制

关于讲解UITabel View的使用 参照 链接 http://www.bubuko.com/infodetail-974265.html - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *identifier = @"cell"; UITableViewCell *cell = [tableV

iOS开发-自己定义重用机制给ScrollerView加入子视图

事实上这个问题我非常早就想过,仅仅是没有通过去写程序实现,昨天有人提起,我就巧了一下 不知道大家打印郭tableview:cellforrow中cell初始的次数,也就是重用池中的cell个数.这个是固定的,比方屏幕最多能够显示4个cell那么重用池个数可能为5个6个或者7左右,我就想了假设scrollview去实现,子视图也应该是有一个个数的,那么怎样去实现重用池呢? 我想到了数组,可变数组,我在loadview中将scrollview的可滑动区域设置为10000.然后给scrollview每

ios UItableView,UITableViewHeaderFooterView分组头部的重用机制,简单地仿射变换CGAffineTransform

怎样设置包括第一栏在内相同高度的section(小技巧,虽然容易但容易忽略) *第一步,在viewdidload里将尾部设为0,table.sectionFooterHeight = 0;(代理方法)- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{ return 0; }虽然也可以设置尾部高度,但是设置后没有效果 第二步,调用tableView的代理方法- (CGF

iOS学习笔记(4) — UITableView的 重用机制

iOS学习笔记(4) — UITableView的 重用机制 UITableView中的cell是动态的,在使用过程中,系统会根据屏幕的高度(480)和每个cell的高度计算屏幕中需要显示的cell的个数.比如,cell高度为90.那么480 / 90 = 5 + 1,也就是说最多有6个cell能显示在屏幕中. 系统会创建1个cel池,无论tableview有多少行都只创建6个cell放在池中.当某行移出屏幕的时候,将这个cell放回在池中:当某行需要显示在屏幕中时,从池中取出一个cell. 重

IOS 控件 - UITableView 的重用机制

转载来自:http://blog.csdn.net/joiningss/article/details/6702023 一. UITableView 的重用机制: iphone重用机制是苹果为了实现大量数据显示而采用的一种节省内存的机制,比如在UITableView和ScrollView 等地方.为什么要“可重用”???对于我们的项目来说,内存控制是必不可少的,如果一个tableview有几百个cell,这个内存消耗是很大的,而且有些cell里面都有image之类的很占内存的资源存在的话,那这样

iOS基础篇(十三)——UITableView(一)重用机制

UITableView是app开发中常用到的控件,功能很强大,常用于数据的显示.在学习UITableView使用之前,我们先简单了解一下: 1.UITableView的重用机制 UITableView最核心的思想就是UITableViewCell的重用机制,对于一个UITableView而言,可能需要显示成百上千个Cell,如果每个cell都单独创建的话,会消耗很大的内存,为了避免这种情况,重用机制就诞生了. UITableView的重用机制的实现关键在于下面这个的函数:UITableViewC