RunLoop 即運(yùn)行循環(huán)赎瞎,也叫事件循環(huán)牌里,本質(zhì)為一個(gè)死循環(huán)。iOS一個(gè)程序運(yùn)行起來(lái)之后务甥,默認(rèn)會(huì)開啟一個(gè)運(yùn)行循環(huán)牡辽,有需要處理的操作時(shí),比如用戶的輸入事件時(shí)缓呛,RunLoop會(huì)自己跑起來(lái)運(yùn)行,沒(méi)有需要處理的事件時(shí)進(jìn)入休息休眠的狀態(tài)杭隙,充分節(jié)省CPU資源哟绊,提高程序的性能。
一痰憎、RunLoop的作用:
1.保證程序運(yùn)行不退出票髓,準(zhǔn)確的說(shuō)是保證線程的不退出,一般一個(gè)線程對(duì)應(yīng)一個(gè)RunLoop铣耘。一個(gè)線程的任務(wù)執(zhí)行完畢之后洽沟,就會(huì)退出,有時(shí)候我們需要一個(gè)線程隨時(shí)待命蜗细,保持運(yùn)行的狀態(tài)不會(huì)退出裆操,例如主線程,這就需要RunLoop這樣的機(jī)制來(lái)完成這樣的任務(wù)炉媒。
RunLoop實(shí)際上只是一個(gè)對(duì)象踪区,只是給我們提供了一個(gè)函數(shù)的入口來(lái)執(zhí)行RunLoop的邏輯。
2.處理app的各種事件:包括輸入源和定時(shí)源吊骤,處理的順序遵循先進(jìn)先出的隊(duì)列順序缎岗。
3.節(jié)省CPU資源,優(yōu)化程序:當(dāng)沒(méi)有事件可處理的時(shí)候白粉,RunLoop會(huì)通知系統(tǒng)传泊,現(xiàn)在沒(méi)有事情要處理了鼠渺,可以休息了,系統(tǒng)可以節(jié)省出資源去做其他的事情眷细,當(dāng)有事件要處理的時(shí)候拦盹,RunLoop立刻運(yùn)行起來(lái)進(jìn)行處理。
二薪鹦、RunLoop與線程的關(guān)系:
1.一條線程都有與之對(duì)應(yīng)的唯一的RunLoop的對(duì)象掌敬。
2.RunLoop在第一次獲取時(shí)創(chuàng)建,在線程運(yùn)行結(jié)束后銷毀池磁,只有在線程內(nèi)部獲取到該線程的RunLoop(主線程除外)奔害。
3.主線程的RunLoop自動(dòng)開啟,子線程的RunLoop需要手動(dòng)開啟地熄。
在我們平時(shí)建立項(xiàng)目的時(shí)候华临,其實(shí)已將使用了RunLoop,程序的啟動(dòng)入口:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain函數(shù)內(nèi)部就是啟動(dòng)了主線程的RunLoop端考。
4.RunLoop其實(shí)就是用來(lái)管理線程的雅潭,可以說(shuō),沒(méi)有線程却特,就沒(méi)有RunLoop存在的必要扶供,在RunLoop一旦開啟之后,就會(huì)對(duì)線程進(jìn)行管理操作裂明,在線程執(zhí)行完任務(wù)后椿浓,線程便會(huì)進(jìn)入休眠狀態(tài),并且不會(huì)退出闽晦,隨時(shí)等待新的任務(wù)扳碍。
5.我們可以通過(guò)以下的代碼獲取主線程和當(dāng)前線程RunLoop.
[NSRunLoop currentRunLoop];? ? ? ? [NSRunLoop mainRunLoop];
三、RunLoop的幾種mode:
基本上有五種形式的mode仙蛉,有的是蘋果內(nèi)部使用笋敞,我們實(shí)際開發(fā)中用不到:
1、kCFRunLoopDefaultMode 默認(rèn)模式荠瘪,通常主線程在這個(gè)模式下運(yùn)行
2夯巷、UITrackingRunLoopMode 界面跟蹤Mode,用于追蹤Scrollview觸摸滑動(dòng)時(shí)的狀態(tài)哀墓。
3鞭莽、kCFRunLoopCommonModes 占位符,帶有Common標(biāo)記的字符串麸祷,比較特殊的一個(gè)mode澎怒;
4、UIInitializationRunLoopMode:剛啟動(dòng)App時(shí)進(jìn)入的第一個(gè)Mode,啟動(dòng)后不在使用喷面。
5星瘾、GSEventReceiveRunLoop:內(nèi)部Mode,接收系事件
其中惧辈,NSRunLoopCommonModes等效于NSDefaultRunLoopMode和NSEventTrackingRunLoopMode兩種模式的結(jié)合
需要注意的是:RunLoop每次只能指定一種Mode琳状。而且如果需要切換 Mode,只能退出當(dāng)前 Loop盒齿。所以一般我們見到的定時(shí)器實(shí)現(xiàn)無(wú)線輪播功能的時(shí)候念逞,需要將定時(shí)器加入到RunLoop的模式改為NSRunLoopCommonModes,才能實(shí)現(xiàn)滾動(dòng)界面的時(shí)候不會(huì)影響到輪播器的滾動(dòng)边翁,就是這個(gè)原因翎承。