標籤:
前面寫了些關於runloop的基本內容,好多人說runloop,那麼runloop有什麼作用呢?
它的基本作用:
♦保持程式的持續運行 (runloop就是一個不斷啟動並執行死迴圈)
♦處理app中的各種事件(比如觸摸事件、定時器事件、selector事件)
♦節省CPU資源,提高程式效能;(因為使用runloop時我們可以控制它在該做事時做事,該休息時休息)
我們知道在app啟動後會在主線程自動開啟一個runloop,如果沒有runloop,那麼我們的程式就會在啟動後直接結束
下面我們來看看runloop的處理邏輯:
1、通知Observer:即將進入loop
2、通知Observer:將要處理Timer
3、通知Observer:將要處理Source0(註:事件來源在這裡筆者按函數調用棧來分的,分為Source0(使用者主動觸發的,非基於連接埠port的)、Source1(基於連接埠port的))
4、處理Source1(關於Source1我們可以這樣理解:該事件是基於連接埠的事件,所以會進行內部的分發出timer事件與Source0事件)
5、如果有Source1就跳到第9步(在這裡我們可以看到runloop的執行迴圈,只有把timer與事件來源全部處理完才會進入休眠,否則會迴圈執行直到處理完為止)
6、通知Observer:線程即將休眠
7、休眠,等待喚醒
8、通知Observer:線程剛被喚醒
9、處理喚醒時收到的訊息,之後跳回第2步
10、通知Observer:即將退出loop(當runloop的時間到了或者當所線上程掛掉都會退出)
看過這些我們對runloop的內部處理邏輯有了一些瞭解了,下面我們再來看看runloop的一個經典用法;
runloop的一個主要經典應用就是常駐線程,比如當我們使用子線程的時候,當線程裡面的任務結束之後,這個線程就會掛掉,之後我們在調用這個線程的start方法就會失效,在這個時候我們使用runloop就可以建立一個常駐線程,防止線程死亡。
自動釋放池問題
最後就是關於runloop的自動釋放池問題,我們知道runloop會建立自動釋放池,它的第一次建立是在啟動runloop時,它最後一次銷毀是在runloop推出的時候,但runloop並不止與一次建立於銷毀,所以線上程即將休眠的時候也會銷毀一次自動釋放池並重新建立一個新的。
關於runloop的理論暫時先寫這些,有了這些理解應該可以協助讀者更好的去理解runloop並運用它。
ios開發中關於runloop的內部流程及一些說明補充