Runloop
1.讲讲 RunLoop,项目中有用到吗?
- 事件循环,在程序运行中循环做一些事情
- 没有消息mach_msg()切换用户态到内核态线程休眠,有消息内核态切换到用户态
runloop相关:
- Timer、performSelector
- GCD、AutoreleasePool
- 事件响应、收拾识别、网络请求
runloop的应用:
- 线程包活
- 解决timer滑动停止问题
- 监听主线程卡顿
- 性能优化
2.runloop的6种状态和runloop内部实现逻辑?
1 | /* Run Loop Observer Activities */ |
- source0 : 触摸事件、performSelectorOnThread:
- source1: 基于Port的线程间通讯,捕获到的系统事件
- timers: NSTimer + performSelector:afterDelay:
- observers: 监听runloop的状态/autoreleasePool的创建和释放、UI的刷新
3.runloop和线程的关系?
- 一一对应
- 保存在一个全局字典中,线程是key, runloop是value
- 子线程默认没有runloop,在第一次获取runloop时才会创建。
- runloop在线程结束时销毁
4.timer 与 runloop 的关系?
程序中添加每3秒响应一次的NSTimer,当拖动tableview时timer可能无法响应要怎么解决?
5.runloop 是怎么响应用户操作的, 具体流程是什么样的?
6.说说runLoop的几种状态
7.runloop的mode作用是什么?
CFRunLoopModeRef代表RunLoop的运行模式
一个RunLoop包含若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
RunLoop启动时只能选择其中一个Mode,作为currentMode
如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出