iOS RunLoop

如何檢測或者優(yōu)化app的卡頓?
用instrument里面的time profiler
自己做一個檢測卡頓的小工具?(runloop)


https://juejin.im/post/6844903588712415239

RunLoop實際很簡單,它是一個對象,它和線程是一一對應(yīng)的,每個線程都有一個對應(yīng)的RunLoop對象,主線程的RunLoop會在程序啟動時自動創(chuàng)建,子線程需要手動獲取來創(chuàng)建
Runloop 和線程是綁定在一起的。每個線程(包括主線程)都有一個對應(yīng)的 Runloop 對象。我們并不能自己創(chuàng)建 Runloop 對象,但是可以獲取到系統(tǒng)提供的 Runloop 對象。

Runloop 和線程是綁定在一起的。每個線程(包括主線程)都有一個對應(yīng)的 Runloop 對象。我們并不能自己創(chuàng)建 Runloop 對象,但是可以獲取到系統(tǒng)提供的 Runloop 對象。
主線程的 Runloop 會在應(yīng)用啟動的時候完成啟動,其他線程的 Runloop 默認(rèn)并不會啟動,需要我們手動啟動

從源碼很容易看出,Runloop總是運行在某種特定的CFRunLoopModeRef下(每次運行__CFRunLoopRun()函數(shù)時必須指定Mode)。而通過CFRunloopRef對應(yīng)結(jié)構(gòu)體的定義可以很容易知道每種Runloop都可以包含若干個Mode,每個Mode又包含Source/Timer/Observer。每次調(diào)用Runloop的主函數(shù)__CFRunLoopRun()時必須指定一種Mode,這個Mode稱為 _currentMode,當(dāng)切換Mode時必須退出當(dāng)前Mode,然后重新進(jìn)入Runloop以保證不同Mode的Source/Timer/Observer互不影響。

CFRunLoopObserver是觀察者,可以觀察RunLoop的各種狀態(tài),并拋出回調(diào)。

RunLoop和線程的一一對應(yīng)的,對應(yīng)的方式是以key-value的方式保存在一個全局字典中
主線程的RunLoop會在初始化全局字典時創(chuàng)建
子線程的RunLoop會在第一次獲取的時候創(chuàng)建,如果不獲取的話就一直不會被創(chuàng)建
RunLoop會在線程銷毀時銷毀

source0是非基于Port的。只包含了一個回調(diào)(函數(shù)指針),它并不能主動觸發(fā)事件。使用時,你需要先調(diào)用 CFRunLoopSourceSignal(source),將這個 Source 標(biāo)記為待處理,然后手動調(diào)用 CFRunLoopWakeUp(runloop) 來喚醒 RunLoop,讓其處理這個事件。

Source1除了包含回調(diào)指針外包含一個mach port,Source1可以監(jiān)聽系統(tǒng)端口和通過內(nèi)核和其他線程通信,接收、分發(fā)系統(tǒng)事件,它能夠主動喚醒RunLoop(由操作系統(tǒng)內(nèi)核進(jìn)行管理

/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), //即將進(jìn)入run loop
kCFRunLoopBeforeTimers = (1UL << 1), //即將處理timer
kCFRunLoopBeforeSources = (1UL << 2),//即將處理source
kCFRunLoopBeforeWaiting = (1UL << 5),//即將進(jìn)入休眠
kCFRunLoopAfterWaiting = (1UL << 6),//被喚醒但是還沒開始處理事件
kCFRunLoopExit = (1UL << 7),//run loop已經(jīng)退出
kCFRunLoopAllActivities = 0x0FFFFFFFU
};

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

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

  • 什么是RunLoop? 可以理解為字面意思:Run表示運行,Loop表示循環(huán)。結(jié)合在一起就是運行的循環(huán)的意思。哈哈...
    Nothing_xy閱讀 425評論 0 0
  • Runloop是iOS和OSX開發(fā)中非?;A(chǔ)的一個概念,從概念開始學(xué)習(xí)。 RunLoop的概念 -般說,一個線程一...
    小貓仔閱讀 1,105評論 0 1
  • 一、基礎(chǔ)篇 1.RunLoop是什么 RunLoop字面意思是跑圈,實際就是運行循環(huán)(即死循環(huán))其實它內(nèi)部就是do...
    irenb閱讀 497評論 0 1
  • RunLoop 前言 RunLoop是iOS/OS開發(fā)中比較基礎(chǔ)的一個概念,在蘋果開發(fā)中用在事件處理,延遲加載,屏...
    etund閱讀 2,934評論 6 20
  • 首先,本文借鑒Haley_Wong - 簡書的文章。 每次當(dāng)大家提起runloop的時候,腦海中總是浮現(xiàn)的...
    Hedgehog___閱讀 2,168評論 2 12

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