前言
在蘋果官方文檔中對Run Loops
的介紹是:
Run Loops 是與線程相關(guān)的基礎(chǔ)結(jié)構(gòu)的一部分躁劣;
Run Loop 是一個用于調(diào)度工作和協(xié)調(diào)事件接受的事件處理循環(huán);
Run Loop的目的是在有工作時當線程保持忙碌醒第,沒有工作時讓線程休眠供置。
RunLoop
是事件循環(huán)機制在iOS
中的一種實現(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]; // 獲取當前線程的RunLoop闷营,如果不存在則創(chuàng)建
[NSRunLoop mainRunLoop]; // 獲取主線程的RunLoop
在Core Foundation
框架中
CFRunLoopGetCurrent(); // 獲取當前線程的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)建唉锌,子線程默認沒有開啟Runloop
。