顧名思義:運(yùn)行循環(huán),在程序運(yùn)行中循環(huán)做一些事情。
應(yīng)用范疇:定時(shí)器(Timer),performSelector,GCD Async Main Queue,事件響應(yīng),手勢(shì)識(shí)別,界面刷新,網(wǎng)絡(luò)請(qǐng)求,AutoreleasePool
基本作用:保持程序的持續(xù)運(yùn)行,處理App中的各種事件(比如觸摸事件,定時(shí)器事件等),節(jié)省CPU資源,提高程序性能(該做事時(shí)做事,該休息時(shí)休息)


圖二相比圖一,這都是RunLoop的作用,說(shuō)明在UIApplicationMain的方法中已經(jīng)嵌入了RunLoop
RunLoop的偽代碼:

iOS中有兩套API來(lái)訪問和使用RunLoop:
1.Foundation:NSRunLoop;
2.Core Foundation:CFRunLoopRef。
兩者都表示RunLoop對(duì)象,NSRunLoop是基于CFRunLoopRef的一層OC封裝
獲取RunLoop對(duì)象:
Foundation:[NSRunLoop currentRunLoop],[NSRunLoop mainRunLoop]
Core Foundation:CFRunLoopGetCurrent(),CFRunLoopGetMain()
RunLoop相關(guān)的類(Core Foundation中關(guān)于RunLoop的五個(gè)類):
CFRunLoopRef,CFRunLoopModeRef,CFRunLoopSourceRef(事件源),CFRunLoopTimerRef(計(jì)時(shí)器),CFRunLoopObserverRef



source0: 指的是非基于端口por,說(shuō)白了也就是處理觸摸事件,selector事件
source1:基于端口的port,是處理系統(tǒng)的一些事件
timers:定時(shí)器,NSTimer
observers:監(jiān)聽器,監(jiān)聽RunLoop的運(yùn)行狀態(tài),可以監(jiān)聽的時(shí)間有即將進(jìn)入Loop,即將處理Timer,即將處理Source,即將進(jìn)入休眠,剛從休眠中喚醒,即將退出Loop
一個(gè)RunLoop包含若干個(gè)Mode,每個(gè)Mode又包含若干個(gè)Source0/Source1/Timer/Observer。RunLoop啟動(dòng)時(shí)只能選擇其中一個(gè)Mode,作為currentMode。如果需要切換Mode,只能退出當(dāng)前Loop,再重新選擇一個(gè)Mode進(jìn)入。不同組的Source0/Source1/Timer/Observer能分隔開來(lái),互不影響。如果Mode里沒有任何Source0/Source1/Timer/Observer,RunLoop會(huì)立馬退出。
目前已知的Mode有五種:
1.kCFRunLoopDefaultMode:App的默認(rèn)Mode,通常主線程在這個(gè)Mode下運(yùn)行
2.UITrackingRunLoopMode:界面跟蹤Mode,用于ScrollView追蹤觸摸滑動(dòng),保證界面滑動(dòng)時(shí)不受其他Mode影響
3.UIInitializationRunLoopMode:在剛啟動(dòng)App時(shí)進(jìn)入的第一個(gè)Mode,啟動(dòng)完成后不再使用
4.GSEventReceiveRunLoopMode:接收系統(tǒng)事件的內(nèi)部Mode,通常用不到
5.kCFRunLoopCommonModes:這是一個(gè)占位用的Mode,不是一種真正的Mode
RunLoop與線程:
RunLoop和線程:每條線程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象,RunLoop保存在全局的字典中,線程作為key,RunLoop作為value,線程剛創(chuàng)建的時(shí)候并沒有RunLoop對(duì)象,RunLoop會(huì)在第一次獲取的時(shí)候創(chuàng)建,RunLoop會(huì)在線程結(jié)束時(shí)銷毀。
RunLoop的運(yùn)行邏輯:

本文結(jié)束。