最近發現很多朋友都在找關于runloop的資料,今天有幸總結了一下,希望可以在面試的過程中幫著到你。
runloop:
1、簡介:
RunLoop是一個對象,這個對象在循環中用來處理程序運行過程中出現的各種事件(比如說觸摸事件、UI刷新事件、定時器事件、Selector事件),從而保持程序的持續運行;而且在沒有事件處理的時候,會進入睡眠模式,從而節省CPU資源,提高程序性能。
2、說明:
Runloop是程序一直存在并不斷處理事件的原因
main函數中的Runloop:
a. 在UIApplication函數內部就啟動了一個Runloop 該函數返回一個int類型的值:
b. 默認啟動的Runloop是跟主線程相關聯的
3、Runloop對象:
在iOS開發中有兩套api來訪問Runloop
a. foundation框架【NSRunloop】
b. core foundation框架【CFRunloopRef】
c. NSRunLoop和CFRunLoopRef都代表著RunLoop對象,它們是等價的,可以互相轉換
d. NSRunLoop是基于CFRunLoopRef的一層OC包裝,所以要了解RunLoop內部結構,需要多研究CFRunLoopRef層面的API(Core Foundation層面)
4、蘋果不允許直接創建 RunLoop,它只提供了兩個自動獲取的函數:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。
1.獲得當前Runloop對象
NSRunLoop * runloop1 = [NSRunLoop currentRunLoop];
CFRunLoopRef runloop2 = CFRunLoopGetCurrent();
2.拿到當前應用程序的主Runloop(主線程對應的Runloop)
NSRunLoop * runloop1 = [NSRunLoop mainRunLoop];
CFRunLoopRef runloop2 = CFRunLoopGetMain();
5、程序主線程一開始,就會一直跑,那么其內部一定是開啟了一個和主線程對應的RunLoop,并且可以看出函數返回的是一個int返回值的 UIApplicationMain()函數
6、CFRunloopRef與線程之間的關系:
1、線程在處理完自己的任務后一般會退出,為了實現線程不退出能夠隨時處理任務的機制被稱為EventLoop,windows程序的消息循環,iOS、OSX的RunLoop都是這種機制。
2、線程和RunLoop是一一對應的,關系保存在全局的字典里。
3、在主線程中,程序啟動時,系統默認添加了有kCFRunLoopDefaultMode 和 UITrackingRunLoopMode兩個預置Mode的RunLoop,保證程序處于等待狀態,如果接收到來自觸摸事件等,就會執行任務,否則處于休眠中。
4、線程創建時并沒有RunLoop,(主線程除外),RunLoop不能創建,只能主動獲取才會有。RunLoop的創建是在第一次獲取時,RunLoop的銷毀是發生在線程結束時。只能在一個線程中獲取自己和主線程的RunLoop。
7、Core Foundation中關于RunLoop的5個類
CFRunLoopRef //獲得當前RunLoop和主RunLoop
CFRunLoopModeRef //運行模式,只能選擇一種,在不同模式中做不同的操作
CFRunLoopSourceRef //事件源,輸入源
CFRunLoopTimerRef //定時器時間
CFRunLoopObserverRef //觀察者
8、Core Foundation中關于RunLoop的5個類之間的相互關系
1、runloop啟動之后會選擇一種運行模式,在執行執行會先檢查運行模式內部是否有source和timers,如果一個sourc或者是一個timer都沒有那么runlooop啟動之后就立刻退出了。
2、runlooop的source有兩種分類方法
按照以前的分類方法可以分為: 基于端口的 自定義的 performSelector事件
按照函數調用棧來劃分: source0 soucrce1
3、observer,可以用來監聽當前runloop運行狀態的改變,注意(Core foundation框架)
4、NSTimer必須添加到runloop中才會工作,且其工作收到runloop運行模式的影響。defultMode UItrackingMode
9、什么時候使用run loop
1、僅當在為你的程序創建輔助線程的時候,你才需要顯式運行一個run loop。
2、對于輔助線程,你需要判斷一個run loop是否是必須的。如果是必須的,那么你要自己配置并啟動它。你不需要在任何情況下都去啟動一個線程的run loop