RunLoop
RunLoop是事件接收和分發(fā)機(jī)制的一個(gè)實(shí)現(xiàn)俄周,是線程相關(guān)的基礎(chǔ)框架的一部分,一個(gè)RunLoop就是一個(gè)事件處理的循環(huán),用來(lái)不停的調(diào)度工作以及處理輸入事件串稀。
RunLoop本質(zhì)是一個(gè) do-while循環(huán),沒(méi)事做就休息狮杨,來(lái)活了就干活母截。與普通的while循環(huán)是有區(qū)別的,普通的while循環(huán)會(huì)導(dǎo)致CPU進(jìn)入忙等待狀態(tài)橄教,即一直消耗cpu清寇,而RunLoop則不會(huì),RunLoop是一種閑等待护蝶,即RunLoop具備休眠功能华烟。 RunLoop的作用
保持程序的持續(xù)運(yùn)行
處理App中的各種事件(觸摸、定時(shí)器持灰、performSelector)
-
節(jié)省cpu資源盔夜,提供程序的性能,該做事就做事,該休息就休息 2喂链、RunLoop和線程的關(guān)系
image.jpegimage.jpegimage.jpegimage.jpeg
image.jpeg
RunLoop和mode是一對(duì)多
mode和Item也是一對(duì)多
image.jpeg
相關(guān)面試題
面試題1當(dāng)前有個(gè)子線程返十,子線程中有個(gè)timer。timer是否能夠執(zhí)行 并進(jìn)行持續(xù)的打油治ⅰ洞坑?
image.jpeg
不可以,因?yàn)樽泳€程的runloop默認(rèn)不啟動(dòng)蝇率, 需要runloop run啟動(dòng)迟杂,需要將上述代碼改成下面這樣
image.jpeg
面試題2:RunLoop和線程的關(guān)系
- 每個(gè)線程都有一個(gè)與之對(duì)應(yīng)的RunLoop,所以RunLoop與線程是一一對(duì)應(yīng)的瓢剿,其綁定關(guān)系通過(guò)一個(gè)全局的DIctionary存儲(chǔ)逢慌,線程為key,runloop為value间狂。
- 線程中的RunLoop主要是用來(lái)管理線程的攻泼,當(dāng)線程的RunLoop開(kāi)啟后,會(huì)在執(zhí)行完任務(wù)后進(jìn)行休眠狀態(tài)鉴象,當(dāng)有事件觸發(fā)喚醒時(shí)忙菠,又開(kāi)始工作,即有活時(shí)干活纺弊,沒(méi)活就休息
- 主線程的RunLoop是默認(rèn)開(kāi)啟的牛欢,在程序啟動(dòng)之后,會(huì)一直運(yùn)行淆游,不會(huì)退出
- 其他線程的RunLoop默認(rèn)是不開(kāi)啟的傍睹,如果需要,則手動(dòng)開(kāi)啟 面試3:NSRunLoop 和 CFRunLoopRef 區(qū)別
- NSRunLoop是基于CFRunLoopRef面向?qū)ο蟮腁PI犹菱,是不安全的
- CFRunLoopRef是基于C語(yǔ)言拾稳,是線程安全的 面試5:以+scheduledTimerWithTimeInterval:的方式觸發(fā)的timer,在滑動(dòng)頁(yè)面上的列表時(shí)腊脱,timer會(huì)暫头玫茫回調(diào), 為什么陕凹?如何解決悍抑?
- timer停止的原因是因?yàn)榛瑒?dòng)scrollView時(shí),主線程的RunLoop會(huì)從NSDefaultRunLoopMode切換到UITrackingRunLoopMode杜耙,而timer是添加在NSDefaultRunLoopMode搜骡。所以timer不會(huì)執(zhí)行
- 將timer放入NSRunLoopCommonModes中執(zhí)行