iOS底层面试题--RunLoop
1、什么是RunLoop?
-
顧名思義: 1、運(yùn)行循環(huán),在程序運(yùn)行過程中循環(huán)做一些事情。 2、iOS中有2套API來訪問和使用RunLoop √ Foundation:NSRunLoop √ Core Foundation:CFRunLoopRef 3、NSRunLoop和CFRunLoopRef都代表著RunLoop對(duì)象 4、NSRunLoop是基于CFRunLoopRef的一層OC包裝 5、CFRunLoopRef是開源的
-
RunLoop的基本作用: 1、保持程序的持續(xù)運(yùn)行 2、處理App中的各種事件(比如觸摸事件、定時(shí)器事件等) 3、節(jié)省CPU資源,提高程序性能:該做事時(shí)做事,該休息時(shí)休息 ......
-
CFRunLoopModeRef √ CFRunLoopModeRef代表RunLoop的運(yùn)行模式 √ 一個(gè)RunLoop包含若干個(gè)Mode,每個(gè)Mode又包含若干個(gè)Source0/Source1/Timer/Observer √ RunLoop啟動(dòng)時(shí)只能選擇其中一個(gè)Mode,作為currentMode √ 如果需要切換Mode,只能退出當(dāng)前Loop,再重新選擇一個(gè)Mode進(jìn)入 √ 不同組的Source0/Source1/Timer/Observer能分隔開來,互不影響 √ 如果Mode里沒有任何Source0/Source1/Timer/Observer,RunLoop會(huì)立馬退出 √ kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默認(rèn)Mode,通常主線程是在這個(gè)Mode下運(yùn)行 √ UITrackingRunLoopMode:界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動(dòng),保證界面滑動(dòng)時(shí)不受其他 Mode 影響
-
應(yīng)用范疇: √ 定時(shí)器(Timer)、PerformSelector √ GCD Async Main Queue √ 事件響應(yīng)、手勢(shì)識(shí)別、界面刷新 √ 網(wǎng)絡(luò)請(qǐng)求 √ AutoreleasePool
-
RunLoop在實(shí)際開中的應(yīng)用 √ 控制線程生命周期(線程保活) √ 解決NSTimer在滑動(dòng)時(shí)停止工作的問題 √ 監(jiān)控應(yīng)用卡頓 √ 性能優(yōu)化
2、RunLoop與線程關(guān)系?
- 每條線程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象
- RunLoop保存在一個(gè)全局的Dictionary里,線程作為key,RunLoop作為value
- 線程剛創(chuàng)建時(shí)并沒有RunLoop對(duì)象,RunLoop會(huì)在第一次獲取它時(shí)創(chuàng)建
- RunLoop會(huì)在線程結(jié)束時(shí)銷毀
- 主線程的RunLoop已經(jīng)自動(dòng)獲取(創(chuàng)建),子線程默認(rèn)沒有開啟RunLoop
3、RunLoop的運(yùn)行邏輯?
3.1、各種事件解析-
Source0 觸摸事件處理 performSelector:onThread:
-
Source1 基于Port的線程間通信 系統(tǒng)事件捕捉
-
Timers NSTimer performSelector:withObject:afterDelay:
-
Observers 用于監(jiān)聽RunLoop的狀態(tài) UI刷新(BeforeWaiting) Autorelease pool(BeforeWaiting)
3.2、運(yùn)行邏輯 01、通知Observers:進(jìn)入Loop 02、通知Observers:即將處理Timers 03、通知Observers:即將處理Sources 04、處理Blocks 05、處理Source0(可能會(huì)再次處理Blocks) 06、如果存在Source1,就跳轉(zhuǎn)到第8步 07、通知Observers:開始休眠(等待消息喚醒) 08、通知Observers:結(jié)束休眠(被某個(gè)消息喚醒) 01> 處理Timer 02> 處理GCD Async To Main Queue 03> 處理Source1 09、處理Blocks 10、根據(jù)前面的執(zhí)行結(jié)果,決定如何操作 01> 回到第02步 02> 退出Loop 11、通知Observers:退出Loop
總結(jié)
以上是生活随笔為你收集整理的iOS底层面试题--RunLoop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 翻译神器拓宽语言沟通边界传神Transn
- 下一篇: NOIP 2018 普及组 解题报告