一、UITableView数据源同步解决方案
-
并发访问、数据拷贝:当主线程的数据拷贝给子线程后(子线程做了一系列的数据操作),主线程删除了某一条数据同时刷新UI同时记录删除操作,当子线程即将结束回到主线程刷新UI同时也删除主线程的记录删除数据,这样就会避免数据拷贝出现数据错误。
2、串行访问
WeChat4cef54f1964f37813deaf31e7dbff38c.png
二、事件响应的传递以及流程
1、UIView与CALayer有什么关系?它们之前的区别是什么?
. UIView为CALayer提供内容以及负责处理触摸事件,参与响应连
.CALayer负责显示内容contents。
为什么UIView只负责事件传递和响应链,CALayer只负责内容显示?
这体现了系统在设计UIView和CALayer上单一职责原则。
2、事件传递与视图响应链
事件传递有主要有两个方法:
-(UIView)hitTest:(CGPiont)point withEvent:(UIEvent*)event;
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event;
WeChat4c86e3d29764ef0676729935887c1536.png
3、视图事件响应方法
WeChat23aafc5dce16d46223b9363012626cfb.png
4、图像显示原理
WeChat48b57ac9b40f675380bbd06a0e05c845.png
5、UI卡顿、掉帧的原因
在规定的16.7ms内,在下一帧vsync信号到来之前,并没有Cpu和Gpu共同完成下一帧合成,于是就导致了UI卡顿或者掉帧。
6、滑动优化方案(UIUTalbelView,ScrollView)
1)对于CPU:对于对象创建、调整、销毁,或者预排版(布局计算、文本计算)放到子线程,预渲染(文本等异步绘制,图片编解码等)
2)GPU:对于纹理渲染*(尽量避免离屏幕渲染),视图混合(减轻视图层级)。
三、UIView绘制原理
image.png当我们调用 【UIView setNeedsDisplay】时候当前视图并没有立刻绘制视图,而是等到当前RunLoop快要结束时候才会调用【CALayer display】进行真正的view绘制。
1、系统绘制流程
image.png2、异步绘制
调用系统:[layer.delegate displayLayer:]
a、需要代理负责生成对应的bitmap(位图)
b、设置该bitmap作为layer.contents属性的值来提交到layer的contents的属性当中
四、离屏渲染
On-Screen Rendering (在屏渲染): 意为当前屏幕渲染,指的是GPU的渲染操作是在当前用与显示的屏幕缓冲区进行。
1、什么是离屏渲染?你对离屏渲染怎样理解的?
当我们制定了UI视图的某些属性标记为它在未愈合成之前不能用于当前屏幕上显示时候就会触发离屏幕渲染。而离屏幕渲染概念起源于GPU层面:是指GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。 (例如:视图圆角属性、遮罩都会触发)。
2、何时会触发?
a、圆角(当和maskToBounds为YES一起使用时,单个时候不会触发)
b、视图图层蒙版
c、阴影
d、光栅化
3、为何要避免?
在触发离屏幕渲染时候会增加GPU工作量,这会导致CPU和GPU工作的总耗时超出了16.7ms,可能会导致UI的卡顿和掉帧。
1、系统的UI事件传递机制是怎样的?
2、使UITableView滚动更加流畅方案或者思路有哪些?
1)对于CPU:对于对象创建、调整、销毁,或者预排版(布局计算、文本计算)放到子线程,预渲染(文本等异步绘制,图片编解码等)。
3、UIView和CALayer之间的关系是怎样的?
UIView是专门负责事件传递和响应的,CALayer是负责UIView的显示工作。这里用的六大设计原则里单一职责原则。
五、runtime
简单的说:Runtime 是一个库,这个库使我们可以在程序运行时创建对象、检查对象,修改类和对象的方法。
四、说一下OC的反射机制
运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的以及动态调用对象的方法的功能就是反射机制.
网友评论