iOS Runloop

RunLoop是什么旨剥?

RunLoop是通過內(nèi)部維護的 事件循環(huán)(Event Loop) 來對 事件/消息 進行管理的一個對象机久。

事件循環(huán)空扎,絕對不止是死循環(huán)這么簡單的一個回答。實質(zhì)上就是runloop內(nèi)部狀態(tài)的轉(zhuǎn)換润讥。

  • 沒有消息處理時转锈,休眠已避免資源占用,由用戶態(tài)切換到內(nèi)核態(tài)(CPU-內(nèi)核態(tài)和用戶態(tài))
    -內(nèi)核態(tài):系統(tǒng)調(diào)用楚殿,牽涉到操作系統(tǒng)撮慨,底層內(nèi)核相關(guān)的指令。

  • 有消息需要處理時脆粥,立刻被喚醒砌溺,由內(nèi)核態(tài)切換到用戶態(tài)
    -用戶態(tài):應(yīng)用程序都是在用戶態(tài),平時開發(fā)用到的api等都是用戶態(tài)的操作

RunLoop 實際上是一個對象变隔,這個對象在循環(huán)中用來處理程序運行過程中出現(xiàn)的各種事件(比如說觸摸事件规伐、UI刷新事件、定時器事件匣缘、Selector事件)猖闪,從而保持程序的持續(xù)運行。RunLoop 在沒有事件處理的時候肌厨,會使線程進入睡眠模式培慌,從而節(jié)省 CPU 資源,提高程序性能柑爸。

Runloop與線程關(guān)系

  • 線程和RunLoop是一一對應(yīng)的,其映射關(guān)系是保存在一個全局的 Dictionary
  • 主線程的 RunLoop 對象系統(tǒng)自動幫助我們創(chuàng)建好了吵护,而子線程的 RunLoop 對象需要我們主動創(chuàng)建和維護。

我們在啟動一個 iOS 程序的時候表鳍,系統(tǒng)會調(diào)用創(chuàng)建項目時自動生成的 main.m 的文件馅而。main.m 文件如下所示:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

其中 UIApplicationMain 函數(shù)內(nèi)部幫我們開啟了主線程的 RunLoopUIApplicationMain 內(nèi)部擁有一個無限循環(huán)的代碼进胯,只要程序不退出/崩潰用爪,它就一直循環(huán)。上邊的代碼中主線程開啟 RunLoop 的過程可以簡單的理解為如下代碼:

int main(int argc, char * argv[]) {        
    BOOL running = YES;
    do {
        // 執(zhí)行各種任務(wù)胁镐,處理各種事件
        // ......
    } while (running);  // 判斷是否需要退出

    return 0;
}

從上邊可看出偎血,程序一直在 do-while 循環(huán)中執(zhí)行诸衔,所以 UIApplicationMain 函數(shù)一直沒有返回,我們在運行程序之后程序不會馬上退出颇玷,會保持持續(xù)運行狀態(tài)笨农。

下圖是蘋果官方給出的 RunLoop模型圖。

官方 RunLoop 模型圖

從上圖中可以看出帖渠,RunLoop 就是線程中的一個循環(huán)谒亦,RunLoop 會在循環(huán)中會不斷檢測,通過 Input sources(輸入源)和 Timer sources(定時源)兩種來源等待接受事件空郊;然后對接受到的事件通知線程進行處理份招,并在沒有事件的時候讓線程進行休息。

RunLoop原理

我們接下來看看Runloop是怎么執(zhí)行循環(huán)的呢狞甚?


大神給出的Runloop運行邏輯圖

這張圖對于我們理解RunLoop來說太有幫助了,下邊我們可以來說下官方文檔給我們的RunLoop邏輯哼审。

在每次運行開啟RunLoop的時候,所在線程的RunLoop會自動處理之前未處理的事件十气,并且通知相關(guān)的觀察者。

具體的順序如下:

  1. 通知觀察者RunLoop已經(jīng)啟動
  2. 通知觀察者即將要開始的定時器
  3. 通知觀察者任何即將啟動的非基于端口的源
  4. 啟動任何準備好的非基于端口的源
  5. 如果基于端口的源準備好并處于等待狀態(tài)砸西,立即啟動籍胯;并進入步驟9
  6. 通知觀察者線程進入休眠狀態(tài)
  7. 將線程置于休眠知道任一下面的事件發(fā)生:
    • 某一事件到達基于端口的源
    • 定時器啟動
    • RunLoop設(shè)置的時間已經(jīng)超時
    • RunLoop被顯示喚醒
  8. 通知觀察者線程將被喚醒
  9. 處理未處理的事件
    • 如果用戶定義的定時器啟動离福,處理定時器事件并重啟RunLoop。進入步驟2
    • 如果輸入源啟動妖爷,傳遞相應(yīng)的消息
    • 如果RunLoop被顯示喚醒而且時間還沒超時,重啟RunLoop绿聘。進入步驟2
  10. 通知觀察者RunLoop結(jié)束次舌。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市挪圾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌哲思,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帝簇,死亡現(xiàn)場離奇詭異靠益,居然都是意外死亡,警方通過查閱死者的電腦和手機闪湾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門绩卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來江醇,“玉大人,你說我怎么就攤上這事凛驮√醣伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵本姥,是天一觀的道長。 經(jīng)常有香客問我婚惫,道長魂爪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任蒋川,我火速辦了婚禮撩笆,結(jié)果婚禮上缸浦,老公的妹妹穿的比我還像新娘餐济。我一直安慰自己,他們只是感情好絮姆,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布篙悯。 她就那樣靜靜地躺著,像睡著了一般鸽照。 火紅的嫁衣襯著肌膚如雪颠悬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天诞外,我揣著相機與錄音灾票,去河邊找鬼。 笑死刊苍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的啥纸。 我是一名探鬼主播埠忘,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼莹妒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了旨怠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤迷扇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蜓席,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡祈秕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年请毛,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞭亮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡统翩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厂汗,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布匣掸,位于F島的核電站,受9級特大地震影響霎匈,放射性物質(zhì)發(fā)生泄漏送爸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一墨吓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧帖烘,春花似錦橄杨、人聲如沸照卦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞬痘。三九已至锄列,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竣况,已是汗流浹背筒严。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摹恨,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓晒哄,卻偏偏與公主長得像寝凌,于是被迫代替她去往敵國和親孝赫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354