iOS中的RunLoop

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è)簡單的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)資源。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容