iOSUI视图面试及原理总结
摘要:
1、UITableViewCell的重用机制描述一下?
2、UITableView相关的数据源同步问题,即如何在tableview解决多线程情况下,数据的处理?
3、是否遇到过卡顿和掉帧的问题,如何解决的,为什么出现卡顿和掉帧的问题?
4、绘制原理&异步绘制、什么是离屏渲染
5、图像显示的原理描述一下
6、iOS中的事件传递流程和视图响应流程
正问:
一、UITableViewCell的重用机制
在开发过程中,
- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (__kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(6_0); 有这两个方法调起UITableViewCell方的重用机制,在tableview新建的时候,会新建一个复用池viewreusepool,这个复用池在oc底层可能是一个队列,保存着当前cell.pool中的复用标识符就是reuseIdentifier,标识着不同种类的cell,所以当我们调用dequeueReusableCellWithIdentifier时,会通过当前reuseIdentifier查找到对应的cell,也就是展示的原型。在创建tableview的时候,会创建一个空的viewreusepool,然后在tableview内部对pool进行管理,一般有两种用法,一种是取出一个空的cell的时候再去创建新的cell,另外一种是预先注册cell,之后再直接从复用池取出来用,不需要初始化.对于第一种用法:第一次调用tableView:cellForRowAtIndexPath由于复用池是空的,会首先创建cell添加到复用池中,第二次调用,当前复用池中有一个cell,这时候因为talbeview上面还未填满,而且复用池的唯一的那个cell已经在使用了,所以取出来的cell仍然为nil,于是继续新建一个cell并返回,复用池再添加一个cell,当前复用池中cell的个数为2.假如当前tableview只能容纳5个cell.那么在滚动到第6个cell时,从tableview的复用池取出来的cell将会是第0行的那个cell.以此类推,当滚动到第7行时,会从复用池取出来第1行的那个cell. 另外,此时不再继续往复用池添加新的cell.二、uitableview的数据源同步问题如何解决在tableview中多线程情况下数据同步的问题?有两种情况一:1、并行访问,数据拷贝,2、串行访问。三、是否遇到过卡顿和掉帧的问题,如何解决的,为什么出现卡顿和掉帧的问题首先卡顿是在规定的的16,7ms之内,下一帧sync信号到来之前,并没有cpu和gpu共同完成下一帧页面的合成,于是就会造成卡顿和掉帧。。滑动优化方案:cpu:1、处理对象的创建、调整、销毁工作;2、欲排版(布局计算、文本计算);3、欲渲染(文本等异步绘制、图片解码等)gpu:1、纹理渲染;2、视图混合四、绘制原理&异步绘制绘制原理:
GPU屏幕渲染有以下两种方式:
1、当前屏幕渲染(On-Screen Rendering)
指的是在当前屏幕缓冲区内进行渲染
2、离屏渲染(Off-Screen Rendering)
指的是在当前屏幕缓冲区以外新开辟的一个缓冲区进行渲染操作
离屏渲染:
当我们处理图层的属性在被指定为未被预合成之前不能直接在屏幕上显示,就触发了离屏渲染,离屏渲染的概念起源于cpu层面,值得是cpu在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。
离屏渲染何时被触发?1、圆角(当和maskToBounds一起使用时,单独的圆角不触发);2、图层蒙版;3、阴影;4、光栅化;5、渐变
特殊的离屏渲染:CPU渲染 如果我们重写了drawRect方法,并且使用任何Core Graphics的技术进行了绘制操作,就涉及到了CPU渲染。整个渲染过程由CPU在App内 同步地完成,渲染得到的bitmap最后再交由GPU用于显示。
要尽量避免使用离屏渲染:1、上下文切换,gpu需要额外的开销;2、创建新的渲染缓冲区,内存消耗;
高级回答:触发离屏渲染会增加gpu的工作量,而增加了gpu的工作量很有可能导致cpu和gpu的工作总耗时超过了15.67ms,从而造成页面的卡顿和掉帧。
转载于:https://www.cnblogs.com/codingStorys/p/9442016.html
iOSUI视图面试及原理总结相关推荐
- 遇见面试--vuex原理
遇见面试 Vuex原理解析 一.前言 自从学习了VUE框架,其中必不可少的会用到vuex这个核心插件,而且在做项目的时候,基本都会使用,可能你会使用vuex状态管理,但是对vuex原理存在着或多或少的 ...
- Android面试Hash原理详解二
Hash系列目录 Android面试Hash原理详解一 Android面试Hash原理详解二 Android面试Hash常见算法 Android面试Hash算法案例 Android面试Hash原理详解 ...
- HashMap面试底层原理(原作者很厉害)
一个HashMap跟面试官扯了半个小时 前言 HashMap应该算是Java后端工程师面试的必问题,因为其中的知识点太多,很适合用来考察面试者的Java基础. 开场 面试官: 你先自我介绍一下吧! 安 ...
- dj鲜生14-类视图的实现原理+代码
截至当前的代码: https://cloud.189.cn/t/ZbERBjq6fmeu (1909221746) 路由系统的路径对应 路由的路径规则,一般是会与一个视图函数对应的 然而在使用类视图时 ...
- 前端面试 浏览器原理
一.浏览器安全 1. 什么是 XSS 攻击? (1)概念 XSS 攻击指的是跨站脚本攻击,是一种代码注入攻击.攻击者通过在网站注入恶意脚本,使之在用户的浏览器上运行,从而盗取用户的信息如 cooki ...
- 前端面试-浏览器原理
一.浏览器 什么是URL 组成部分: protocol:协议,表明浏览器必须使用何种协议 domain:域名,表示正在请求哪个服务器 port:端口 path:网络服务器上资源的路径 paramete ...
- Android面试---OkHttp原理
okHttp原理主要是通过5个拦截器和3个双端队列(2个异步队列,1个同步队列)工作.内部实现通过一个责任链模式完成,将网络请求的各个阶段封装到各个链条中,从而实现各层的解耦. OkHttp底层是通过 ...
- iOS 黑白屏滤镜视图层级穿透原理
添加灰色滤镜方法 @implementation TPBlackWhiteScreenTool+ (void)addGrayFilterToView:(UIView *)view {if (@avai ...
- Linux系统:第十四章:安装Docker,java面试编译原理
systemctl restart docker #centos开放端口宿主机访问 firewall-cmd --add-port=9004/tcp --permanent firewall-cmd ...
最新文章
- java读取文本单词_使用Java计算文本文件中的单词数
- python 异常处理中try else语句的使用
- VS Code运行Python程序
- C# teacher类【C#】
- 21-win10下ElasticSearch.6.1.0安装SQL插件
- MySQL 日期时间相关函数
- HDU多校练习第一场4608——I_Number
- XLINUX-FPGA开发-基础篇-数电-门电路
- Windows 10系统中修改用户名的方法
- 正则表达式 匹配一个数字
- AI助力智能安检,基于目标检测模型实现X光安检图像智能检测分析
- Opengl ES之FBO
- 【前沿技术】在安全且可靠的区块链基础设施中运行业务条线应用
- 圆柱体的投影特点_机械制图常识:圆柱体
- 三维重建中经常遇到的拓扑学概念的通俗解释
- 原始传奇显示区名的服务器,《原始传奇》新人新区需要了解的一些问题
- css3半圆弧线,css3实现画半圆弧线的示例代码
- 软考和高项哪个更好考?
- ctf题库--这是什么鬼东西
- Eclipse中properties配置文件的中文乱码