什么是RunLoop
- 從字面意思看
- 運(yùn)行循環(huán)
- 跑圈
- 基本作用
- 保持程序的持續(xù)運(yùn)行
- 處理App中的各種事件(比如觸摸事件友浸、定時(shí)器事件、Selector事件)
- 節(jié)省CPU資源偏窝,提高程序性能:該做事時(shí)做事收恢,該休息時(shí)休息
- ......
如果沒(méi)有RunLoop
如果有了Runloop
main函數(shù)中的RunLoop
RunLoop對(duì)象
- iOS中有2套API來(lái)訪問(wèn)和使用RunLoop
- Foundation
- NSRunLoop
- Core Foundation
- CFRunLoopRef
- NSRunLoop和CFRunLoopRef都代表著RunLoop對(duì)象
- NSRunLoop是基于CFRunLoopRef的一層OC包裝武学,所以要了解RunLoop內(nèi)部結(jié)構(gòu),需要多研究CFRunLoopRef層面的API(Core Foundation層面)
RunLoop資料
- 蘋(píng)果官方文檔
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html
- CFRunLoopRef是開(kāi)源的
http://opensource.apple.com/source/CF/CF-1151.16/
RunLoop與線程
- 每條線程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象
- 主線程的RunLoop已經(jīng)自動(dòng)創(chuàng)建好了伦意,子線程的RunLoop需要主動(dòng)創(chuàng)建
- RunLoop在第一次獲取時(shí)創(chuàng)建火窒,在線程結(jié)束時(shí)銷毀
獲得RunLoop對(duì)象
Foundation
[NSRunLoop currentRunLoop]; // 獲得當(dāng)前線程的RunLoop對(duì)象
[NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對(duì)象
Core Foundation
CFRunLoopGetCurrent(); // 獲得當(dāng)前線程的RunLoop對(duì)象
CFRunLoopGetMain(); // 獲得主線程的RunLoop對(duì)象
RunLoop相關(guān)類
CFRunLoopModeRef
- CFRunLoopModeRef代表RunLoop的運(yùn)行模式
- 一個(gè) RunLoop 包含若干個(gè) Mode,每個(gè)Mode又包含若干個(gè)Source/Timer/Observer
- 每次RunLoop啟動(dòng)時(shí)驮肉,只能指定其中一個(gè) Mode熏矿,這個(gè)Mode被稱作 CurrentMode
- 如果需要切換Mode,只能退出Loop离钝,再重新指定一個(gè)Mode進(jìn)入
- 這樣做主要是為了分隔開(kāi)不同組的Source/Timer/Observer票编,讓其互不影響
- 系統(tǒng)默認(rèn)注冊(cè)了5個(gè)Mode:
?kCFRunLoopDefaultMode:App的默認(rèn)Mode,通常主線程是在這個(gè)Mode下運(yùn)行
?UITrackingRunLoopMode:界面跟蹤 Mode奈辰,用于 ScrollView 追蹤觸摸滑動(dòng)栏妖,保證界面滑動(dòng)時(shí)不受其他 Mode 影響
?UIInitializationRunLoopMode: 在剛啟動(dòng) App 時(shí)第進(jìn)入的第一個(gè) Mode,啟動(dòng)完成后就不再使用
?GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的內(nèi)部 Mode奖恰,通常用不到
kCFRunLoopCommonModes: 這是一個(gè)占位用的Mode,不是一種真正的Mode
CFRunLoopSourceRef
- CFRunLoopSourceRef是事件源(輸入源)
- 以前的分法
Port-Based Sources
Custom Input Sources
Cocoa Perform Selector Sources
- 現(xiàn)在的分法
Source0:非基于Port的
Source1:基于Port的
CFRunLoopTimerRef
- CFRunLoopTimerRef是基于時(shí)間的觸發(fā)器
- 基本上說(shuō)的就是NSTimer
CFRunLoopObserverRef
RunLoop處理邏輯-官方版
RunLoop處理邏輯-網(wǎng)友整理版
RunLoop應(yīng)用
- NSTimer
- ImageView顯示
- PerformSelector
- 常駐線程
- 自動(dòng)釋放池