講講Runloop,項目中有用到嗎?
其實Runloop內部就是一個do while循環(huán),這個循環(huán)內部不斷處理各種任務(比如Source, timer, observer),一個線程對應一個runloop,主線程的runloop默認開啟,子線程的runloop需要手動開啟(調用run方法),runloop只能選擇一個mode啟動,如果當前mode中沒有任何source(source0,source1)、timer,那么就直接退出runloop。
Runloop的基本作用:
保持程序的持續(xù)運行
處理APP中的各種事件(比如觸摸事件、定時器事件)
節(jié)省CPU資源,提高程序性能:該做事時做事,該休息時休息
Runloop應用范疇:
定時器(timer)、performSelector
GCD Async Main Queue
事件響應、手勢識別、界面刷新
網絡請求
AutoreleasePool
Runloop在實際項目中應用:
控制線程生命周期(線程?;? AFNetworking就是使用Runloop使子線程保活)
解決NSTimer在滑動時停止工作問題
監(jiān)控應用卡頓
性能優(yōu)化
Runloop的內部實現邏輯

Runloop的內部實現邏輯圖.jpg
Runloop和線程的關系
每一條線程都有唯一的一個與之對應的Runloop對象
Runloop保存在一個全局的Dictionary里,線程作為Key,Runloop作為value
線程剛創(chuàng)建事沒有Runloop對象,Runloop會在第一次獲取它時創(chuàng)建
timer與Runloop的關系,拖動tableView時,timer無法響應要怎么解決
timer是運行在Runloop里的,runloop來控制timer什么時候執(zhí)行。
Runloop是怎么響應用戶操作的,具體流程
說說Runloop的幾種狀態(tài)
Runloop的mode作用是什么
RunLoop的運行模式(一共5種)
- kCFRunLoopDefaultMode:APP默認mode,通常主線程在這個mode下運行
- UITrackingRunLoopMode:界面跟蹤mode,用于ScrollView追蹤觸摸滑動,保證界面滑動時不受其他Mode的影響。
- UIInitializationRunLoopMode:在剛啟動APP時進入的第一個mode,啟動完成后就不在使用
- GSEventReceiveRunLoopMode:接受系統(tǒng)事件的內部mode,通常用不到
- kCFRunLoopCommonModes:這是一個占位用的mode,不是一種真正的運行模式