1.1.1Runloop是事件接收和分發(fā)機(jī)制的一個(gè)實(shí)現(xiàn)。Runloop提供了一種異步執(zhí)行代碼的機(jī)制,不能并行執(zhí)行任務(wù)麸锉。在主隊(duì)列中,Main RunLoop直接配合任務(wù)的執(zhí)行舆声,負(fù)責(zé)處理UI事件花沉、定時(shí)器以及其他內(nèi)核相關(guān)事件柳爽。
RunLoop的主要目的:保證程序執(zhí)行的線程不會(huì)被系統(tǒng)終止。
1.1.2 對(duì)其它線程來說碱屁,run loop默認(rèn)是沒有啟動(dòng)的磷脯,如果你需要更多的線程交互則可以手動(dòng)配置和啟動(dòng),如果線程只是去執(zhí)行一個(gè)長時(shí)間的已確定的任務(wù)則不需要忽媒。
1.1.3 在任何一個(gè)Cocoa程序的線程中争拐,都可以通過 NSRunLoop *runloop = [NSRunLoop currentRunLoop] 來獲取到當(dāng)前線程的run loop。
1.2 關(guān)于run loop的幾點(diǎn)說明
1.2.1 Cocoa中的NSRunLoop類并不是線程安全的
我們不能再一個(gè)線程中去操作另外一個(gè)線程的run loop對(duì)象晦雨,那很可能會(huì)造成意想不到的后果架曹。不過幸運(yùn)的是CoreFundation中的不透明類CFRunLoopRef是線程安全的,而且兩種類型的run loop完全可以混合使用闹瞧。Cocoa中的NSRunLoop類可以通過實(shí)例方法:
- (CFRunLoopRef)getCFRunLoop;
獲取對(duì)應(yīng)的CFRunLoopRef類绑雄,來達(dá)到線程安全的目的。
1.2.2 Run loop的管理并不完全是自動(dòng)的奥邮。
我們?nèi)员仨氃O(shè)計(jì)線程代碼以在適當(dāng)?shù)臅r(shí)候啟動(dòng)run loop并正確響應(yīng)輸入事件万牺,當(dāng)然前提是線程中需要用到run loop。而且洽腺,我們還需要使用while/for語句來驅(qū)動(dòng)run loop能夠循環(huán)運(yùn)行脚粟,下面的代碼就成功驅(qū)動(dòng)了一個(gè)run loop:
BOOL isRunning = NO;
do {
isRunning = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDatedistantFuture]];
} while (isRunning);
1.2.3 Run loop同時(shí)也負(fù)責(zé)autorelease pool的創(chuàng)建和釋放
在使用手動(dòng)的內(nèi)存管理方式的項(xiàng)目中,會(huì)經(jīng)常用到很多自動(dòng)釋放的對(duì)象蘸朋,如果這些對(duì)象不能夠被即時(shí)釋放掉核无,會(huì)造成內(nèi)存占用量急劇增大。Run loop就為我們做了這樣的工作藕坯,每當(dāng)一個(gè)運(yùn)行循環(huán)結(jié)束的時(shí)候团南,它都會(huì)釋放一次autorelease pool,同時(shí)pool中的所有自動(dòng)釋放類型變量都會(huì)被釋放掉炼彪。
1.3.4 Run loop的優(yōu)點(diǎn)
一個(gè)run loop就是一個(gè)事件處理循環(huán)吐根,用來不停的監(jiān)聽和處理輸入事件并將其分配到對(duì)應(yīng)的目標(biāo)上進(jìn)行處理。如果僅僅是想實(shí)現(xiàn)這個(gè)功能辐马,你可能會(huì)想一個(gè)簡(jiǎn)單的while循環(huán)不就可以實(shí)現(xiàn)了嗎拷橘,用得著費(fèi)老大勁來做個(gè)那么復(fù)雜的機(jī)制?顯然喜爷,蘋果的架構(gòu)設(shè)計(jì)師不是吃干飯的膜楷,你想到的他們?cè)缇拖脒^了。
首先贞奋,NSRunLoop是一種更加高明的消息處理模式,他就高明在對(duì)消息處理過程進(jìn)行了更好的抽象和封裝穷绵,這樣才能是的你不用處理一些很瑣碎很低層次的具體消息的處理轿塔,在NSRunLoop中每一個(gè)消息就被打包在input source或者是timer source(見后文)中了。
其次,也是很重要的一點(diǎn)勾缭,使用run loop可以使你的線程在有工作的時(shí)候工作揍障,沒有工作的時(shí)候休眠,這可以大大節(jié)省系統(tǒng)資源俩由。