什么是Runloop
從字面意思來看是運(yùn)行循環(huán)免钻,在程序運(yùn)行過程中循環(huán)做一些事情,如果沒有Runloop程序執(zhí)行完畢就會(huì)立即退出崔拥,如果有Runloop程序會(huì)一直運(yùn)行极舔,并且時(shí)時(shí)刻刻在等待用戶的輸入操作.RunLoop可以在需要的時(shí)候自己跑起來運(yùn)行,在沒有操作的時(shí)候就停下來休息.充分節(jié)省CPU資源链瓦,提高程序性能
Runloop的作用
1.保持程序的持續(xù)運(yùn)行.程序啟動(dòng)就會(huì)開啟一個(gè)主線程,主線程開啟就會(huì)跑一個(gè)主線程對(duì)應(yīng)的runloop.runloop保證主線程不會(huì)被銷毀,也保證程序的持續(xù)的運(yùn)行
2.處理app中的各種事件.觸摸拆魏、定時(shí)器盯桦、Selector事件
3.節(jié)省cpu資源、提高程序的性能.程序運(yùn)行起立,當(dāng)什么操作都不需要的時(shí)候,runloop就告訴cup,現(xiàn)在沒事可做,我可以去休息類.這時(shí)cpu就會(huì)將資源釋放出去做其他的事情,當(dāng)有事件要做的時(shí)候runloop就會(huì)立馬去做事情
通過上圖可以看出渤刃,RunLoop在跑圈過程中拥峦,當(dāng)接收到Input sources 或者 Timer sources時(shí)就會(huì)交給對(duì)應(yīng)的處理方去處理。當(dāng)沒有事件消息傳入的時(shí)候卖子,RunLoop就休息了
Runloop與線程的關(guān)系
1.每一條線程都有唯一一個(gè)Runloop與之對(duì)應(yīng)
2.主線程的runloop是自動(dòng)創(chuàng)建并啟動(dòng)的
3.子線程的runloop需要手動(dòng)啟動(dòng)
獲得RunLoop對(duì)象后要調(diào)用run方法來啟動(dòng)一個(gè)運(yùn)行循環(huán)
// 啟動(dòng)RunLoop
[[NSRunLoop currentRunLoop] run];
RunLoop的其他啟動(dòng)方法
// 第一個(gè)參數(shù):指定運(yùn)行模式
// 第二個(gè)參數(shù):指定RunLoop的過期時(shí)間略号,即:到了這個(gè)時(shí)間后RunLoop就失效了
[[NSRunLoop currentRunLoop] runMode:kCFRunLoopDefaultMode beforeDate:[NSDate distantFuture]];
4.runloop是管理線程的,當(dāng)線程的runloop開啟后,線程會(huì)在執(zhí)行完任務(wù)后進(jìn)去休眠狀態(tài),有來新任務(wù)就會(huì)被喚醒去執(zhí)行任務(wù)
5.runloop在第一個(gè)獲取是被創(chuàng)建,在線程結(jié)束時(shí)被銷毀