iOS底層面試題--RunLoop

d1d2218ecb3b8dfbab4c42db47b6263e.png

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

一、什麼是RunLoop?

  • 顧名思義: 一、運行循環,在程序運行過程當中循環作一些事情。 二、iOS中有2套API來訪問和使用RunLoop √ Foundation:NSRunLoop √ Core Foundation:CFRunLoopRef 三、NSRunLoop和CFRunLoopRef都表明着RunLoop對象 四、NSRunLoop是基於CFRunLoopRef的一層OC包裝 五、CFRunLoopRef是開源的面試

  • RunLoop的基本做用: 一、保持程序的持續運行 二、處理App中的各類事件(好比觸摸事件、定時器事件等) 三、節省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 影響bash

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

  • RunLoop在實際開中的應用 √ 控制線程生命週期(線程保活) √ 解決NSTimer在滑動時中止工做的問題 √ 監控應用卡頓 √ 性能優化oop

二、RunLoop與線程關係?

  • 每條線程都有惟一的一個與之對應的RunLoop對象
  • RunLoop保存在一個全局的Dictionary裏,線程做爲key,RunLoop做爲value
  • 線程剛建立時並無RunLoop對象,RunLoop會在第一次獲取它時建立
  • RunLoop會在線程結束時銷燬
  • 主線程的RunLoop已經自動獲取(建立),子線程默認沒有開啓RunLoop

三、RunLoop的運行邏輯?

image
3.一、各類事件解析

  • Source0 觸摸事件處理 performSelector:onThread:性能

  • Source1 基於Port的線程間通訊 系統事件捕捉優化

  • Timers NSTimer performSelector:withObject:afterDelay:spa

  • Observers 用於監聽RunLoop的狀態 UI刷新(BeforeWaiting) Autorelease pool(BeforeWaiting)線程

3.二、運行邏輯 0一、通知Observers:進入Loop 0二、通知Observers:即將處理Timers 0三、通知Observers:即將處理Sources 0四、處理Blocks 0五、處理Source0(可能會再次處理Blocks) 0六、若是存在Source1,就跳轉到第8步 0七、通知Observers:開始休眠(等待消息喚醒) 0八、通知Observers:結束休眠(被某個消息喚醒) 01> 處理Timer 02> 處理GCD Async To Main Queue 03> 處理Source1 0九、處理Blocks 十、根據前面的執行結果,決定如何操做 01> 回到第02步 02> 退出Loop 十一、通知Observers:退出Loopcode

相關文章
相關標籤/搜索