前言
在蘋果官方文檔中對Run Loops的介紹是:
Run Loops 是與線程相關(guān)的基礎(chǔ)結(jié)構(gòu)的一部分;
Run Loop 是一個用于調(diào)度工作和協(xié)調(diào)事件接受的事件處理循環(huán);
Run Loop的目的是在有工作時當(dāng)線程保持忙碌,沒有工作時讓線程休眠。
RunLoop是事件循環(huán)機(jī)制在iOS中的一種實(shí)現(xiàn)方式。
正文
RunLoop的應(yīng)用范疇
- 保證程序不會退出
- 定時器(
Timer)、NSObject的performSelector方法執(zhí)行 -
GCD的Async Main Queue事件回調(diào) - 事件響應(yīng)、手勢識別、界面刷新等
UI事件 - 網(wǎng)絡(luò)請求
-
AutoreleasePool管理
RunLoop的獲取方法
在Foundation框架中
[NSRunLoop currentRunLoop]; // 獲取當(dāng)前線程的RunLoop,如果不存在則創(chuàng)建
[NSRunLoop mainRunLoop]; // 獲取主線程的RunLoop
在Core Foundation框架中
CFRunLoopGetCurrent(); // 獲取當(dāng)前線程的RunLoop,如果不存在則創(chuàng)建
CFRunLoopGetMain(); // 獲取主線程的RunLoop
NSRunLoop 是 CFRunLoopRef 的 OC 包裝。并且 CFRunLoopRef 是開源的。
通過閱讀Core Foundation源碼,我們可以得到如下結(jié)論:
-
Runloop與線程密切相關(guān),每條線程都有唯一的一個與之對應(yīng)的Runloop對象; -
Runloop保存在一個全局的字典里,線程作為key,Runloop 作為value ; - 線程剛創(chuàng)建時并沒有
Runloop對象,Runloop會在第一次獲取它時創(chuàng)建,Runloop 會在線程結(jié)束時銷毀; - 主線程的
Runloop已經(jīng)自動創(chuàng)建,子線程默認(rèn)沒有開啟Runloop。