iOS底層面試題--RunLoop

ptlCoder發表於2018-11-25

d1d2218ecb3b8dfbab4c42db47b6263e.png

面試題的答案都是拋磚引玉,具體細節還得深入瞭解iOS底層原理
複製程式碼

1、什麼是RunLoop?

  • 顧名思義: 1、執行迴圈,在程式執行過程中迴圈做一些事情。 2、iOS中有2套API來訪問和使用RunLoop √ Foundation:NSRunLoop √ Core Foundation:CFRunLoopRef 3、NSRunLoop和CFRunLoopRef都代表著RunLoop物件 4、NSRunLoop是基於CFRunLoopRef的一層OC包裝 5、CFRunLoopRef是開源的

  • RunLoop的基本作用: 1、保持程式的持續執行 2、處理App中的各種事件(比如觸控事件、定時器事件等) 3、節省CPU資源,提高程式效能:該做事時做事,該休息時休息 ......

  • CFRunLoopModeRef √ 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會立馬退出 √ kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的預設Mode,通常主執行緒是在這個Mode下執行 √ UITrackingRunLoopMode:介面跟蹤 Mode,用於 ScrollView 追蹤觸控滑動,保證介面滑動時不受其他 Mode 影響

  • 應用範疇: √ 定時器(Timer)、PerformSelector √ GCD Async Main Queue √ 事件響應、手勢識別、介面重新整理 √ 網路請求 √ AutoreleasePool

  • RunLoop在實際開中的應用 √ 控制執行緒生命週期(執行緒保活) √ 解決NSTimer在滑動時停止工作的問題 √ 監控應用卡頓 √ 效能優化

2、RunLoop與執行緒關係?

  • 每條執行緒都有唯一的一個與之對應的RunLoop物件
  • RunLoop儲存在一個全域性的Dictionary裡,執行緒作為key,RunLoop作為value
  • 執行緒剛建立時並沒有RunLoop物件,RunLoop會在第一次獲取它時建立
  • RunLoop會線上程結束時銷燬
  • 主執行緒的RunLoop已經自動獲取(建立),子執行緒預設沒有開啟RunLoop

3、RunLoop的執行邏輯?

image
3.1、各種事件解析

  • Source0 觸控事件處理 performSelector:onThread:

  • Source1 基於Port的執行緒間通訊 系統事件捕捉

  • Timers NSTimer performSelector:withObject:afterDelay:

  • Observers 用於監聽RunLoop的狀態 UI重新整理(BeforeWaiting) Autorelease pool(BeforeWaiting)

3.2、執行邏輯 01、通知Observers:進入Loop 02、通知Observers:即將處理Timers 03、通知Observers:即將處理Sources 04、處理Blocks 05、處理Source0(可能會再次處理Blocks) 06、如果存在Source1,就跳轉到第8步 07、通知Observers:開始休眠(等待訊息喚醒) 08、通知Observers:結束休眠(被某個訊息喚醒) 01> 處理Timer 02> 處理GCD Async To Main Queue 03> 處理Source1 09、處理Blocks 10、根據前面的執行結果,決定如何操作 01> 回到第02步 02> 退出Loop 11、通知Observers:退出Loop

相關文章