RunLoop筆記

什麼是Runloop?

顧名思義,運行循環,在程序運行過程中做一些事情,Runloop也是一個對象。

應用範圍:

1.定時器(Timer)、PerformSelector
2.GCD Async Main Queue。//GCD主線程(GCD的子線程是不需要Runloop的
3.事件響應、手勢識別、界面刷新
4.網絡請求
5.AutoreleasePool
如果沒有Runloop程序運行完就會結束退出。
調用UIApplicationMain()函數會生成Runloop。

Runloop的基本作用:

1.保持程序的持續運行
2.處理APP中的各種時間(比如觸摸時間、定時器事件等)
3.節省CPU資源,提高程序性能:該做事時做事,該休息時休息
4. …
iOS中有2套API來訪問和使用Runloop:

  1. Foundation:NSRunLoop—OC的
  2. Core Foundation:CFRunLoopRef—C語言的
    NSRunLoop 和 CFRunLoopRef都代表RunLoop對象
    NSRunLoop是基於CFRunLoopRef的一層OC包裝
    CFRunLoopRef是開源的

RunLoop與線程:

1.每條線程都有唯一的一個與之對應的RunLoop對象
2.RunLoop保存在一個全局的Dictionary裏,線程作爲key,RunLoop作爲value
3.線程剛創建時並沒有RunLoop對象,RunLoop會在第一次獲取它時創建
4.RunLoop會在線程結束時銷燬
5.主線程的RunLoop已經自動獲取(創建),子線程默認沒有開啓RunLoop
獲取RunLoop對象:
Foundation框架下

  1. [NSRunLoop currentRunLoop]; //獲得當前線程的RunLoop對象
  2. [NSRunLoop mainRunLoop]; //獲得主線程的RunLoop對象

CFRunLoopModeRef:

1.CFRunLoopModeRef代表RunLoop的運行模式
2.一個RunLoop包含若干個Mode,每個Mode又包含若干個Source0/Source1/Timer/Observer
3.RunLoop啓動時只能選擇其中一個Mode,作爲currentMode
4.如果需要切換Mode,只能退出當前Mode,再重新選擇一個Mode進入
<1不同組的Source0/Source1/Timer/Observer能分隔開來,互不影響
5.如果Mode裏沒有任何Source0/Source1/Timer/Observer,RunLoop會立馬退出

runloop有以下幾種狀態:**
/* Run Loop Observer Activities */
typedef CF_OPTIONS(CFOptionFlags,CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), // 即將進入Loop
kCFRunLoopBeforeTimers = (1UL << 1), // 即將處理Timer
kCFRunLoopBeforeSources = (1UL << 2),// 即將處理Source
kCFRunLoopBeforeWaiting = (1UL << 5),// 即將進入休眠
kCFRunLoopAfterWaiting = (1UL << 6), // 剛從休眠中喚醒
kCFRunLoopExit = (1UL << 7), // 即將退出Loop
kCFRunLoopAllActivities = 0x0FFFFFFFU
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章