iOS-UITableView的优化(纯手打原创)
TableView的优化
一:什么是TableView的优化以及为什么要优化
1)CPU(中央处理器)和GPU(图形处理器) CPU主要从事逻辑计算的一些工作 GPU主要从事图形处理方面的工作
2)CPU和GPU的共同点:
都有自己的缓存体系 都有自己的数字和逻辑运算单元 都为了完成计算任务而设计
3)CPU和GPU的不同点:
CPU的核少但是核内空间非常大 能够处理复杂的逻辑
GPU核多但是每个核的空间相对较小 故而处理复杂逻辑的空间较少
针对CPU和GPU的上述不同,面对一个程序系统分配给CPU的往往是较为复杂的逻辑运算,分配给GPU的通常是图片等控件的操作
4)上述不同而导致的结果
当程序员为CPU编程时,倾向于用复杂的逻辑结构优化算法来减少计算任务的时间 Latency
为GPU编程->利用其能够处理海量数据的优势,来提高总的数据的吞吐量 来掩盖Latency
5)为什么优化
学术上:平衡CPU和GPU在工作上的压力,从而正确的使用CPU和GPU的资源,使他们均匀的负载 这样子使得FPS保持在60帧左右,最终使得用户体验更加美好
非学术上:掌握UITableView能够给面试加分
二:UITableView的工作原理
1)tablewView代理方法的执行顺序
UITableView返回多少组----->每组返回多少行cell--->计算每个cell的高度---->指定cell(cell布局)
2)cell的复用
原理:当滚动列表时(UITableView)部分cell会移除Window 但是移除的cell并没有被立即释放 而是放到了一个叫做复用池的对象池中,处于待定状态,当有新的cell要出现在Window界面上时,首先会从复用池中寻找是否有相同类型的cell,如果有直接拿过用(最直观的表现是新出现的cell有没有开辟新的内存空间),如果没有,创建一个新的类型的cell,所以UITableView可能拥有多种类型的cell,复用池也可能存储着多种类型的cell,系统通过定义reuseIndentifer作为每个cell的唯一标示符来确定即将出现的cell复用何种类型的cell
三:UITableView的具体优化
1)尽量使用cell的复用
使用cell的复用,可以减少内存的开销,没有开辟新的空间,也减少了一些计算量
2)对于不定高的cell 提前将每个cell的高度存入数组,出现一个cell的时候,直接从数组中拿出确切的高度即可,不用临时计算cell的高度
图文混排、评论
对于固定高的cell和不定高的cell同样适用
3)涉及网络请求加载数据在UITableView滑动结束的时候在进行加载数据(渲染)避免卡顿
1.UITableView继承自UIScrollView,继承了后者的方法
//滑动结束的方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
//减速结束之后的方法
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
2.if(self.tableView.dragging==NO&&self.tableView.decelerating==NO)在tableView必须实现的二个方法中(加载cell的方法中)将数据的渲染写在上述if语句中
4)对于tableView的自定义控件 尤其是UIImageView,尽量减少使用圆角,阴影等layer属性,尽量减少使用alpha(透明度)来设置透明度,(在项目开发中,让UI设计师设计原图就是带圆角的图) 阴影,圆角这些layer效果都是在GPU中完成的
1.当多个视图重叠时,GPU会进行合成渲染,而渲染的最慢的操作就是混合,因此当视图结构太过复杂,就会大量消耗GPU的资源,所以当一个空间本身是不透明,注意设定alpha为1,这样可以避免无用的alpha通道合成,降低GPU的负载
2.对控件设置cornerRadius后对其进行clip或mask操作时 会导致offscreenrendering这个也是在GPU中进行的 如果在滑动时 圆角对象太多 回到GPU的负载大增幅
这时我们可以设置layer的shouldRasterize属性为YES,可以将负载转移给CPU 更彻底的是直接使用带圆角的原图
5)尽量使用懒加载
又称为延迟加载 实际上是重写某个对象的getter方法 原理:程序一开始并不对它进行初始化 而是在用到他的时候 才为他开辟内存供它使用
好处:
1.不必将创建的对象的代码全部写在ViewDidLoad中,代码可读性强
2.每个控件的getter方法,分别负责各自的实例化处理,代码彼此之间独立性强 松耦合
6)减少返回给的cell里面的处理逻辑和处理时间
驴妈妈为例:各个UI控件整合到一起 实际上只有一个控件
7)设置每个cell的opaque属性 ----面试亮点
opaque意思是不透明的 浑浊的 有YES和NO二个结果
alpha 透明度
如果控件本身不透明,我们设置opaque为YES
8)分段加载数据
设置分页加载数据 也就是上拉刷新和下拉加载
iOS-UITableView的优化(纯手打原创)的更多相关文章
- iOS开发:UITableView的优化技巧-异步绘制Cell
最近在微博上看到一个很好的开源项目VVeboTableViewDemo,是关于如何优化UITableView的.加上正好最近也在优化项目中的类似朋友圈功能这块,思考了很多关于UITableView的优 ...
- iOS UITableView优化
一.Cell 复用 在可见的页面会重复绘制页面,每次刷新显示都会去创建新的 Cell,非常耗费性能. 解决方案:创建一个静态变量 reuseID,防止重复创建(提高性能),使用系统的缓存池功能. s ...
- iOS程序性能优化
iOS程序性能优化 一.初级 使用ARC进行内存管理 在iOS5发布的ARC,它解决了最常见的内存泄露问题.但是值得注意的是,ARC并不能避免所有的内存泄露.使用ARC之后,工程中可能还会有内存泄露, ...
- iOS 程序性能优化
前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...
- UITableView滑动性能优化扩展
一点UITableView滑动性能优化扩展 影响UITableView的滑动,有哪些因素呢? 关于这一点,人眼能识别的帧率是60左右,这也就是为什么,电脑屏幕的最佳帧率是60Hz. 屏幕一秒钟会刷 ...
- iOS UITableView划动删除的实现
标签:划动删除 iphone 滑动删除 ios UITableView 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rainb ...
- iOS UITableView Tips(2)
#TableView Tips(2) (本来想一章就结束TableView Tips,但是发现自己还是太天真了~too young,too simple) ##架构上的优化 在Tips(1)中指出了一 ...
- iOS项目分析及优化
iOS项目分析及优化 来源:吴白的简书 从代码看一个程序员的笔力 从代码的整洁度上就可以看出一个程序员的实力,规范其实就是让你养成一种良好习惯的标杆,在此面前我们应该顺从.本篇我们以OC为例,统 ...
- 【iOS Instrument性能优化集】
iOS Instrument性能优化集 1.UIImage缓存取舍 在项目代码中看到大量使用如下代码: UIImage使用 在Main Thread中发现不同动画场景中Image IO 开销和耗时所占 ...
随机推荐
- 【转】nginx+iis实现负载均衡
最近在研究分布式系统架构方面的知识,包括负载均衡,数据库读写分离,分布式缓存redis等.本篇先从负载均衡服务架构入手,关于负载均衡百度百科的定义如下:负载均衡,英文名称为Load Balance,其 ...
- iOS阶段学习第三天笔记(运算符)
iOS学习(C语言)知识点整理笔记 1.运算符 一.算术运算符 1)表达式由变量.常量.运算符构成,有确定的类型和值 2)算术运算符包括: +(加),-(减),*(乘),/(除),%(模) 3)算术运 ...
- Kinect V2 基础教程之彩色图像
本程序为自己所写,参考素材包括微软官方例子和外文资料,自己做了部分的优化.解释的如果有问题,恳请大家指正. 后台代码: using System.ComponentModel; using Syste ...
- EntityFramework中几种更改数据的方式
首先声明个实体类,该实体类是EntityFrameWork自动生成的,对应数据表Test结构如下 public partial class Test { public int Id{ get; set ...
- autofac 使用
var builder = new ContainerBuilder();var container = builder.Build(); var assemblies = new Directory ...
- jquery练习(一次性赋予多个属性值)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- luogg_java学习_03_流程控制及循环结构
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 程序流程控制 顺序结构 分支结构:if-else,sw ...
- 内存只有4G的MBP要怎么破
开发工具包括浏览器都是极占内存的,没有个8G根本不行啊. 怎一个慢字了得? 补记: 放弃谷歌浏览器是正道
- Java集合源码分析(五)HashSet<E>
HashSet简介 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. HashSet源 ...
- 定时任务服务 CronService使用说明
CronServiceInstaller.exe 部署安装程序 1.在打开该程序前务必设置为管理员运行 2.点击注册服务 3.检查服务是否开启,点击 services.msc, 打开系统服务列表 4 ...