文档章节

UITableView的优化原理

哥特复心
 哥特复心
发布于 2013/11/29 00:54
字数 1100
阅读 5328
收藏 11

当我们下啦一个 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对象

<!-- lang: cpp -->
UITableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"ci"];

NSString *str = [NSString stringWithFormat:@"我是cell块——————%d",indexPath.row]; NSLog(@"%d------%p",indexPath.row,tableViewCell); tableViewCell.textLabel.text = str;

下面是优化好的代码:

<!-- lang: cpp -->

//

// pyViewController.m // 1128-05UITableView的优化设计 // // Created by panyong on 13-11-28. // Copyright (c) 2013年 panyong. All rights reserved. //

#import "pyViewController.h"

@interface pyViewController ()<UITableViewDataSource,UITableViewDelegate>

@end @implementation pyViewController

  • (void)viewDidLoad { [super viewDidLoad]; //设置tableView类型,UITableViewStyleGrouped和UITableViewStylePlain类型
    UITableView *tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; [self.view addSubview:tableView]; tableView.dataSource = self;//设置数据源代理 设置tableviewcell内的数据 tableView.delegate = self;//设置代理 设置tableviewcell的高度 }

// 返回cell的行数 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 70; }

//返回cell -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //注意此处生成的cell的类型ci类型,ci可以随便写! UITableViewCell *tableViewCell = [tableView dequeueReusableCellWithIdentifier:@"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:UITableViewCellStyleDefault reuseIdentifier:@"ci"]; } //iphone官方加载机制是出现再屏幕上的内容(如tableViewCell)才加载,所以注意此处的打印!!!!一开始的时候由于我设置了cell的高度,一个3.5寸的屏幕只有显示三条cell, NSLog(@"%d------%p",indexPath.row,tableViewCell); tableViewCell.textLabel.text = str;

return tableViewCell;

}

//dele的一个方法返回cell的高度,该方法是实现协议UITableViewDelegate的方法

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 180;//这里为了方便演示效果,所以设置了cell的高度 }

@end

屏幕显示结果如下 在此输入图片描述 打印内存结果如下,! 在此输入图片描述

其实我们应该好好理解以下内存池的概念,苹果公司为了性能考虑,设计的这个理念!!!! tableViewCell.textLabel.text = str;这一句你可以放入内存池中试一下结果,呵呵,想清楚了吗????

© 著作权归作者所有

共有 人打赏支持
哥特复心
粉丝 109
博文 68
码字总数 40593
作品 0
长沙
高级程序员
私信 提问
加载中

评论(3)

C
CallPro
这只是Cell的重用而已吧...哪来优化呢
C
CallPro
这只是Cell的重用而已吧...哪来优化呢
撸红薯
撸红薯
这个也叫优化??
UI_09 UITableView(表视图)

⼀、表视图 在iOS中,要实现表格数据展示,最常用的做法就是使用UITableView。UITableView继承自UIScrollView,因此支持垂直滚动,而且性能极佳 1、表示图的样式 UITableViewStylePlain UITa...

黑伞将军
2015/08/26
0
0
UITableView can scroll background view

UITableView的backgroundView属性可以设置其背景,但是背景不能随Table的拖动而移动,也就是固定不移动的。有没有办法让其背景也随拖动而移动呢。深入研究了一下UITableView api,好像没有提...

长平狐
2012/08/13
172
0
UITableView实用详解

一、UITableView1.数据展示的条件1> UITableView的所有数据都是由数据源(dataSource)提供的,所以要想在UITableView展示数据,必须设置UITableView的dataSource数据源对象2> 要想当UITable...

哥特复心
2014/01/05
0
0
iOS开发小技巧:刷新UITableView

在很多APP界面都用到的UITableView,对iOS开发者来说一定不陌生吧。网上关于UITableView的文章早已多不胜数,尤其是关于UITableView优化方面的,对开发者来说非常值得一看。 现在就来看看,刷...

flyurt
2015/10/23
1K
0
关于UITableView你知道多少——UITableView简单解析

转自萧宸宇的博客 UITableView是在iOS开发中,展示大量内容的首选。我个人认为的原因有以下几点: 1.UITableView的展现形式是为移动设备专门设计过的。有较好的人机交互体验。 2.从技术角度来...

浪子艾菲儿
2013/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Redis之父表示ARM服务器没戏!

ARM表示Neoverse N1平台和E1 CPU即将发布,Neoverse N1和E1采用7nm制程,并且为服务器和通信设备增加重要提升,拥有高可扩展性、高处理量以及高性能,将分别在2020年和2021年投入使用。 与C...

linuxCool
17分钟前
2
0
YARN 内存参数终极详解

YARN环境中应用程序JAR包冲突问题的分析及解决 Hadoop框架自身集成了很多第三方的JAR包库。Hadoop框架自身启动或者在运行用户的MapReduce等应用程序时,会优先查找Hadoop预置的JAR包。这样的...

stys35
22分钟前
0
0
Mybatis常用总结一

这一节的学习强烈建议实际操作 主键自增和自定义主键 实现描述:我们在写程序时,时常会遇到这样的问题:插入一条数据,但因有主键的存在,而有时候会报“违反唯一性约束”的错误,我们可以使...

大笨象会跳舞吧
23分钟前
0
0
计数二进制子串

leetcode:https://leetcode.com/problems/count-binary-substrings/ 给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起...

woshixin
26分钟前
0
0
mysql utf8mb4字符集,存储emoji表情

字符集utf8mb4 utf8mb4兼容utf8,且比utf8能表示更多的字符。 看unicode编码区 从1 ~ 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8mb4扩充区,什么时候你需要存储那些...

我心中有猛狗
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部