UITableView的优化原理
2019独角兽企业重金招聘Python工程师标准>>>
当我们下啦一个 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;这一句你可以放入内存池中试一下结果,呵呵,想清楚了吗????
转载于:https://my.oschina.net/panyong/blog/179949
UITableView的优化原理相关推荐
- ios开源框架——UITableView+FDTemplateLayoutCell优化UITableViewCell高度计算
前言 这篇文章是我和我们团队最近对UITableViewCell利用AutoLayout自动高度计算和UITableView滑动优化的一个总结.从这篇文章里,你可以读到: UITableView高度计 ...
- deeplearning算法优化原理
deeplearning算法优化原理 目录 • 量化原理介绍 • 剪裁原理介绍 • 蒸馏原理介绍 • 轻量级模型结构搜索原理介绍 Quantization Aware Training量化介绍 1.1 ...
- (0074)iOS开发之UITableView的优化
写的很好引用 https://www.jianshu.com/p/af6b095aaaf3 前言 这篇文章对 UITableView 的优化主要从以下3个方面分析: 基础的优化准则(高度缓存, cel ...
- MATLAB机器学习系列-11:粒子群优化原理及其matlab实现
粒子群优化原理 粒子群算法思想来源于实际生活中鸟捕食的过程.假设在一个n维的空间中,有一群鸟(m只)在捕食,食物位于n维空间的某个点上,对于第i只鸟某一时刻来说,有两个向量描述,一个是鸟的位置向量,第 ...
- UITableView性能优化与卡顿
UITableView性能优化与卡顿问题 最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆 ...
- 计算机系统优化的目的和原理,优化原理
现代企业管理为了以尽可能少的综合耗费获取尽可能大的经济效益和社会效益,就要对生产经营活动中的一切因素.条件及其相互之间的关系进行全面.系统的分析,并在此基础上拟定出多种可供选择的方案,通过比较.论证, ...
- 前端性能优化之图像优化原理
前端性能优化中,图像的优化是非常重要的一环,为什么要说图像的优化呢,而不是我们常见的图片优化?因为这里的图像包括矢量图和位图,我们常说的图片优化是指位图的优化.这篇文章转载至奇舞周刊,大佬总结的非常好 ...
- UITableView性能优化 - 中级篇
老实说,UITableView性能优化 这个话题,最经常遇到的还是在面试中,常见的回答例如: Cell复用机制 Cell高度预先计算 缓存Cell高度 圆角切割 等等. . . 进阶篇 最近遇到一个需 ...
- TensorFlow XLA优化原理与示例
TensorFlow XLA优化原理与示例 XLA概述 XLA(加速线性代数)是用于优化TensorFlow计算的线性代数的域特定编译器.结果是在服务器和移动平台上的速度,内存使用率和可移植性得到了改 ...
最新文章
- ios项目文件结构 目录的整理
- FFT ---- 2021牛客多校第一场 H Hash Function
- 前端 圆形进度图_图解CSS3制作圆环形进度条的实例教程
- 使用javascript打开模态对话框
- fail2ban封IP之Http
- hashmap value占用空间大小_java-测量和监视大型HashMap的大小
- python数字形式转换_在Python中将字母转换为数字
- Android--音乐播放器
- macmini作为远程服务器,如何使用Macbook Pro远程免密码登录Mac mini
- flume学习(十):如何使用Spooling Directory Source
- 【转】@JsonAlias和@JsonProperty注解使用详解
- ubuntu下vscode字体高与缩进不成比
- svn如何提取文件更新列表
- Openwrt 镜像安装
- python匿名函数优点_python匿名函数定义及实例解析
- 利用1.1.1.1进行DNS网络加速,仅需2分钟让网络更快
- 【十三香吗?】网易严选-苹果12商品评论数据可视化分析
- 高颜值好音质的耳机有哪些?好看时尚的真无线蓝牙耳机推荐
- 中国移动互联网公司10年战争史
- Settings学习
热门文章
- 架构之美—软件架构6大步骤(开篇)
- Chap2-构造函数语意学
- 02-15 GUCCI 我喜欢的
- 动态添加ContextMenuStrip项(ToolStripItem)
- STM32串口的使用(原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯)
- idea 项目jar反编译java_带你上手阿里开源的 Java 诊断利器:Arthas
- java 获取六个月账期,应收帐龄分析里面账期分析能不能改为0-30天?
- BigDecimal类型一定不会失真吗?不一定。参数类型为double的构造方法的结果有一定的不可预知性,是有可能产生失真的。
- java中可以作为GC Roots的对象
- 什么情况下会导致@Async异步方法会失效?