都在說RunLoop...... 到底什么是RunLoop?


RunLoop(消息循環):說白了就是一種事件監聽循環。就好比是一個while循環,監聽到事件就起來,沒有就休息。

介紹:

它可以在不同模式下進行切換,iOS有五種模式,其中UIInitializationRunLoopModel應用程序啟動時會使用,啟動完成后將不再使用;GSEventReceiveRunLoopMode這個是接受系統內部的Model,通常做不到。還有UITrackingRunLoopMode、NSDefaultRunLoopMode、NSRunLoopCommonModes三種模式是我們通常用到的,下文中會詳細講解,其中NSRunLoopCommonModes是一個占位符,NSDefaultRunLoopMode和UITrackingRunLoopMode都會綁定這個占位符。

UITrackingRunLoopMode : (優先切換!!)這個模式就是當UI事件交互的時候Runloop切換到的模式!!!

場景:這一模式優先級最高,當UI事件交互的時候,都會優先切換到這一模式。

NSDefaultRunLoopMode :Runloop的默認模式!只要有事件就處理!

場景:默認模式,只要有事件就會自動切換到此模式。

NSRunLoopCommonModes :占位符!!(在默認下和UITrackingRunLoopMode下!)

場景:這個主要用在添加一個NSTimer到RunLoop中。是一個tag,本質上不是一個Mode,默認NSDefaultRunLoopMode和 NSTrackingRunLoopMode都綁定這個tag。

基本作用:

1.保持程序的持續運行(這也是iOS程序為什么能一直不會死的原因)。

2.處理App中的各種事件(比如觸摸事件、selector事件、定時器事件等)。

3.節省CPU資源,提高程序性能,有事件就起來,沒有就休息。

說明:

1.如果沒有Runloop,那么程序一啟動就會退出,什么事情都做不了

2.如果有了Runloop,那么相當於在內部有一個死循環,能夠保證程序的持續運行

3.main函數中的Runloop。

4.在UIApplication函數內部就啟動了一個Runloop,函數返回一個int類型的值。

5.這個默認啟動的Runloop是跟主線程相關聯的。

RunLoop對象:

1.在iOS開發中有兩套API來訪問Runloop:(1).Foundation框架[NSRunloop]。(2).Core Foundation框架[CFRunloopRef]。

2.NSRunLoop和CFRunLoopRef都代表着RunLoop對象,它們是等價的,可以互相轉換。

3.NSRunLoop是基於CFRunLoopRef的一層OC包裝,所以要了解RunLoop內部結構,需要多研究CFRunLoopRef層面的API(Core Foundation層面)。

Runloop與線程:

1.Runloop和線程的關系:一個Runloop對應着一條唯一的線程。

2.Runloop的創建:主線程Runloop已經創建好了,子線程的runloop需要手動創建。

3.Runloop的生命周期:在第一次獲取時創建,在線程結束時銷毀。

獲得Runloop對象:

1.獲得當前Runloop對象:

a. NSRunloop

NSRunLoop * runloop1 = [NSRunLoop currentRunLoop];

b.CFRunLoopRef

CFRunLoopRef runloop2 = CFRunLoopGetCurrent();

2.拿到當前應用程序的主Runloop(主線程對應的Runloop)

a.NSRunloop

NSRunLoop * runloop1 = [NSRunLoop mainRunLoop];

b.CFRunLoopRef

CFRunLoopRef runloop2 = CFRunLoopGetMain();

3.注意點:開一個子線程創建runloop,不是通過alloc init方法創建,而是直接通過調用currentRunLoop方法來創建,它本身是一個懶加載的。

4.在子線程中,如果不主動獲取Runloop的話,那么子線程內部是不會創建Runloop的。可以下載CFRunloopRef的源碼,搜索_CFRunloopGet0,查看代碼。

5.Runloop對象是利用字典來進行存儲,而且key是對應的線程Value為該線程對應的Runloop。

Runloop 總結

可以看出,RunLoop被開啟的線程會一直存在。因為在沒有事件發生的時候處於休眠狀態,有事件發生的時候處於工作狀態。以此來節約CPU資源。這樣就可以讓一個線程成為常駐線程,也就是說該線程一直存在。

RunLoop是iOS事件響應與任務處理最核心的機制,它貫穿iOS整個系統。

RunLoop是一種事件運行循環機制,是保持應用程序持續運行的一種機制。正是由於該機制的存在,應用程序才能在沒有事件發生的時候處於休眠狀態,有事件發生的時候處於工作狀態。以此來節約CPU資源。這也是它的一大特點。

NSRunLoop是Cocoa框架中的類,與之對應的,在Core Foundation中是CFRunLoopRef類。兩者的區別是前者不是線程安全的,后者是線程安全的,且兩者可以相互轉化。

RunLoop和線程的關系:
RunLoop是用來管理線程的,每個線程對應一個RunLoop對象。我們不可以去創建當前線程的RunLoop對象,但是我們可以去獲取當前線程的RunLoop。RunLoop就是來監聽該線程有無事件發生,如果有就工作,如果沒有就休眠。

主線程的RunLoop對象默認開啟,其他線程默認不開啟。

RunLoop與AutoreleasePool;

RunLoop處理的事件類型;

RunLoop的運行模式mode

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM