RunLoop的兩個重要的作用:
1缭受、保證iOS程序運行后不退出(因為RunLoop是一個“死循環(huán)”娃循,才能保證程序運行后不會退出适揉。否則執(zhí)行完main函數(shù)就直接退出黔牵。)
2聪轿、監(jiān)聽事件和傳遞事件(監(jiān)聽系統(tǒng)產(chǎn)生的(點擊事件、拖拽事件猾浦、觸摸事件陆错。。金赦。)所有的事件)音瓷。
RunLoop在何時創(chuàng)建和銷毀:
當(dāng)程序啟動的時候,在執(zhí)行main函數(shù)中的UIApplicationMain函數(shù)內(nèi)部會將RunLoop對象創(chuàng)建出來夹抗。通過查看UIApplicationMain函數(shù)聲明绳慎,該函數(shù)會返回一個int類型的值,但通過剛剛的結(jié)論漠烧,這個UIApplicationMain函數(shù)永遠(yuǎn)也不會有返回值杏愤,因為如果這個UIApplicationMain函數(shù)有返回值放前,那么main函數(shù)就會接收到返回值就直接退出了慢洋,這樣就不能保持應(yīng)用程序一直處于運行狀態(tài)了咳秉。所以UIApplicationMain內(nèi)部必然會創(chuàng)建RunLoop對象來實現(xiàn)永不退出的功能黍图。結(jié)論:在程序啟動的時候豪墅,在執(zhí)行UIApplicationMain函數(shù)內(nèi)部卑硫,系統(tǒng)會負(fù)責(zé)創(chuàng)建RunLoop對象觉增。
RunLoop是死循環(huán)會很耗性能嗎奠货?
不會堕担。如果沒有事件需要處理的話已慢,RunLoop就會讓線程進(jìn)入休眠狀態(tài);在睡眠的時候消耗的性能就非常少了照宝。一旦有事件產(chǎn)生蛇受,RunLoop會立刻喚醒當(dāng)前線程來處理事件。事件處理完畢之后厕鹃,RunLoop會循環(huán)檢測事件的到來兢仰。如果在一定的時間內(nèi)沒有事件產(chǎn)生了乍丈,RunLoop又會讓線程進(jìn)入休眠狀態(tài)來減少開銷。
每個線程都會對應(yīng)一個RunLoop(主線程和子線程):
默認(rèn)主線程的RunLoop是自動開啟的把将,子線程的RunLoop是默認(rèn)不開啟的轻专。若在子線程中有事件發(fā)生的時候就需要開啟RunLoop;開啟方法為:NSRunLoop *runLoop = [NSRunLoop currentRunLoop];