iOS學(xué)習(xí)筆記之RunLoop

前言

蘋果官方文檔中對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)、NSObjectperformSelector方法執(zhí)行
  • GCDAsync 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

NSRunLoopCFRunLoopRefOC 包裝。并且 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。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容