学习笔记

2019-06-14  本文已影响0人  不二ya

UI操作为什么在主线程?

UIKit线程安全性:UIKit并不是一个线程安全的类,UI操作涉及到渲染访问各种View对象的属性,如果异步操作下会存在读写问题,而为其加锁则会耗费大量资源并拖慢运行速度。

Runloop:整个程序的起点UIApplication是在主线程进行初始化,所有的用户事件都是在主线程上进行传递(如点击、拖动),所以view只能在主线程上才能对事件进行响应。 (点击等事件是由系统传递给UIApplication中,并在Main Runloop中进行处理与响应,但是由于UI在后台线程中进行处理,所以他跟事件响应并不同步。即使在UI所在的后台线程也自己维护了一个Runloop,在Runloop结束时候进行渲染,但可能用户已经进行了点击操作了。)

渲染方面:由于图像的渲染需要以60帧的刷新率在屏幕上同时更新,在非主线程异步化的情况下无法确定这个处理过程能够实现同步更新。 (runloop的结尾准备进行渲染的时候,不同线程提交了不同的渲染信息,于是拥有了更多的绘制事务,这个时候Core Animation Pipeline会不断将信息提交,让GPU进行渲染,由于绘制事件的不同步导致了GPU渲染的不同步)

runtime运行时

系统在运行时的一些机制,其最主要的是消息机制,其特点是在运行的时候才会创建对象,使用消息机制发送方法。动态创建机制的好处是,用到的时候运行时才会创建对象。在c语言中,编译时会决定调用哪些函数,编译完后直接执行。oc的函数调用为消息发送,属于动态调用过程。只有在真正运行的时候才会根据函数名称找到对应的函数来调用。

runloop

RunLoop可实现自动释放池、延迟回调、触摸事件、屏幕刷新等功能 一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。runloop让线程在没有处理消息时休眠以避免资源占用、在有消息到来时立刻被唤醒。RunLoop 的核心就是一个 mach_msg() ,RunLoop 调用这个函数去接收消息,如果没有别人发送 port 消息过来,内核会将线程置于等待状态。

上一篇下一篇

猜你喜欢

热点阅读