个人Github地址git
小码哥《恋上数据结构与算法》笔记github
iOS面试资料汇总markdown
Runloop
是经过内部维护的事件循环
来对事件/消息
进行管理的一个对象。
事件循环
就是没有消息须要处理时,休眠以免资源占用。
用户态
切换到内核态
。内核态
切换到用户态
。UIApplicationMain
启动主线程的runloop
runloop
和线程
是一一对应的CFRunLoopMode
NSMutableSet<CFRunLoopMode *>
NSMutableSet<NSString *>
NSMutableSet<<Observer, Timer, Source>>
NSDefaultRunLoopMode
NSMutableSet
NSMutableSet
NSMutableArray
NSMutableArray
Source0
,它并不会主动唤醒线程,须要手动唤醒线程。NSTimer
是能够转换的。kCFRunLoopEntry
kCFRunLoopBeforeTimers
kCFRunLoopBeforeSources
kCFRunLoopBeforeWaiting
(用户态切内核态)kCFRunLoopAfterWaiting
(内核态切用户态)kCFRunLoopExit
mode1
下运行时,只能接收和处理mode1
下的sources
、observers
、timers
,是没法接收mode2
、mode3
下的事件回调的。commonMode
不是实际存在的一种Mode
。Source/Timer/Observer
到多个Mode
中的一种技术方案。currentMode
会从kCFRunLoopDefaultMode
切换到UITrackingRunLoopMode
。CFRunLoopAddTimer(runLoop,timer,commonMode)
函数,将timer
添加到commonMode
当中。commonMode
的做用就是将某一个事件源同步到多个mode
当中。线程
和RunLoop
是一一对应的。线程
默认是没有RunLoop
的。RunLoop
。RunLoop
中添加一个Port/Source
等维持RunLoop
的事件循环。RunLoop
。RunLoop
,它是怎样作到有事作事,没事休息的?RunLoop
与线程是怎样的关系?常驻线程
?UI
的时候不打断用户的滑动操做?
子线程
抛回给主线程
更新UI
的逻辑,包装起来,提交到主线程的kCFRunLoopDefaultMode
下。tableView
处于UITrackingRunLoopMode
模式下就不会执行该逻辑。mode
切换到kCFRunLoopDefaultMode
下,就会处理更新UI
的逻辑。