一、RunLoop是什么?
- 运行循环
- 是个结构体、是个对象,这个对象提供了一个入口函数
- 程序会进入 do..while循环
- 循环处理一些事情
二、Runloop的作用
- 保持程序的持续运行
- 处理APP中的各种事件(触摸、定时器、performSelector)
- 节省cpu资源、提高程序的性能; 该做事就做事,该休息就休息
- 保证线程不退出。
- 负责监听所有的事件(iOS中的触摸、时钟、网络事件)
- RunLoop负责绘制UI
三、Runloop的item
- block应用:
__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__
- 调用timer:
__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
- 响应source0:
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
- 响应source1:
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
- GCD主队列:
__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
- observer源:
__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
四、runloop与线程的关系
![](https://img.haomeiwen.com/i3572360/63832cf23fcb1615.png)
- 一一对应关系, 通过一个全局可变CFMutableDictionaryRef(就是key-value)
- runloop的创建, __CFRunLoopCreate(pthread_main_thread_np())
- runloop 存储, CFDictionarySetValue(dict, pthreadPointer(pthread_main_thread_np()), mainLoop);
- runloop 获取, CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t))
- 线程 -- runloop -- timer
- 子线程runloop 默认不开启
- timer 依赖于runloop
![](https://img.haomeiwen.com/i3572360/78aa99a7538befcd.png)
![](https://img.haomeiwen.com/i3572360/ded32303f9e0ac7f.png)
![](https://img.haomeiwen.com/i3572360/54444e42e12ef08f.png)
![](https://img.haomeiwen.com/i3572360/565ba2350ce52873.png)
![](https://img.haomeiwen.com/i3572360/cd67dd717f1ac090.png)
网友评论