iOS面试题iOS面试

iOS 面试 -- UI视图

2020-01-15  本文已影响0人  唐师兄

前言

做 APP 开发与我们联系最紧密的就是 UI 的开发了,你做 APP 开发,不做 UI 恐怕就是你很努力地学习,但是你从来不参加考试,所以在面试中 UI 视图一定会涉及,而具体面试都面啥,主要有以下几个方面,如下图 :

本文主要就是从 UITableView、事件传递、视图响应、图像显示原理、卡顿掉帧、异步绘制和绘制原理以及离屏渲染 6 大块进行相关的讲解。

1. UITableView

重用机制

上图灰色部分就是tableView 中已经出现过得 A1 cell,当滑动不在屏幕显示时,将其放到重用池,当再次划出时从重用池里面取出,这样避免频繁创建,消耗内存和CPU,从而引起卡顿,如果继续向上滑动 A7 就将会从重用池里面取出,这个就是 tableView 的重用机制

数据源同步

数据源同步

数据源同步的问题多出现在新闻、资讯类 App中,对当前显示的内容进行删除操作的同时,进行 loadmore 操作,loadmore 操作时,会将当前的 data 进行 copy,loadmore 是在子线程进行处理,当服务器返回结果时,那么 loadmore 将原来的 data 和现在新的 data 合并一起,返回主线程data,这个时候,删除操作已经完成,而我们再次 reload 的时候,发现删除的数据,这个时候又显示了,这个就是数据源同步的问题。这种问题解决方案有两种

2. 事件传递与事件响应

UIView和CALayer的关系

事件响应流程

事件响应流程

点击屏幕,事件响应的核心其实方法就是

- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event;   // default returns YES if point is in bounds

第一个方法返回的是一个UIView,是用来寻找最终哪一个视图来响应这个事件;第二个方法是用来判断某一个点击的位置是否在视图范围内,如果在就返回YES

流程描述
hitTest:withEvent: 方法调用
调用流程

3. 图像显示原理

图像显示原理 1

图像显示原理则总线连接 CPU 和 GPU 协同工作,CPU 提交位图,GPU进行位图图层渲染和纹理合成,最终将结果,提交到帧缓冲区,然后由帧缓冲区提交到视频控制器,最后显示在屏幕上
在 iOS 开发上, 显示的流程则是创建一个UIView,然后调用CALayer,生成要显示的内容,最后经过 drawRect绘制,提交到 CoreAnimation 生成位图,以上部分则是 CPU 的工作;然后经过 GPU 的 OpenGL管线渲染生成结果,最后显示在屏幕上

CPU 工作

cpu 的主要工作就是 UI 布局,frame 计算、文本计算、绘制、图片编码器、最后提交位图


图像显示原理 2 CPU 1 CPU 2
CPU 3
CPU 4

GPU GPU

GPU 主要是对 CPU 提供过来的位图顶点着色、图元装配、光栅化、片段着色、片段处理,最后将结果提交到帧缓存区

4. 卡顿&掉帧

卡顿&掉帧
为什么会掉帧和卡顿?

页面滑动一般就是每一秒钟会有 60 帧的画面更新,基于此就是每隔 16.7ms 也就是 1/60就有一帧画面刷新,在这 16.7ms 内就需要 CPU 和 GPU协同工作,产生一帧的数据。如果当CPU消耗的时间过长,或者 GPU 渲染的时间过长,产生一帧的数据耗时超过 16.7ms,那么在下一个 Vsyc 信号到来之前,当前画面没有准备好,那么就会产生掉帧,而在肉眼看来就是卡顿。

滑动优化方案

5. 绘制原理&异步绘制

UIView 的绘制原理

当 UIView的控件在调用[UIView setNeedsDisplay]其实并没有立刻执行绘制工作,而是在当前的 layer 上面打上一个脏标记,接着会调用 [view.layer setNeedsDisplay], 在当前 runloop 将要结束以后,则会调用 [CALayer dispaly]这个方法进行绘制


系统绘制流程
系统绘制流程
流程描述
异步绘制

怎么进行异步绘制呢,其实就是基于系统给我们开的口子layer.delegate,如果遵从或者实现了displayLayer方法,我们就可以进入到异步绘制流程当中,在异步绘制的过程当中通过代理负责生成 bitmap,最后将绘制的bitmap 作为 layer.contents 属性的值


异步绘制时序图

6. 离屏渲染

什么是在屏渲染(On-Screen Rendering)?

就是说当前的屏幕渲染,指的是 GPU 操作发生在当前用于显示屏幕缓冲区进行

什么是离屏渲染?(Off-Screen Rendering)

指的是 GPU 在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
比如说我们设置的圆角属性,蒙层遮罩都会触发离屏渲染

何时会触发?
为何要避免?

总结

以上就是我们 ui 视图部分 iOS 面试中常问到的。高频的题目有

参考文章

https://www.jianshu.com/p/2c16077b50f8
https://www.jianshu.com/p/254ef1640f68

上一篇 下一篇

猜你喜欢

热点阅读