個人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
的邏輯。