一堕担、什么是runloop
顧名思義翻斟,運行循環(huán)。
按照正常的邏輯苞尝,一段代碼由上到下依次執(zhí)行畸肆,執(zhí)行完畢后,程序退出宙址。
對于我們的app來說轴脐,我們希望它一直在運行,等待用戶的交互,并作出響應大咱。那么就需要重復的執(zhí)行代碼恬涧。
相當于一個do...while 循環(huán)
沒錯runloop就是做這件事的。在程序的主入口 main 函數(shù)中將我們的代碼包裹再while 循環(huán)中碴巾。就保證了溯捆,程序的可持續(xù)性。
那么runloop都做了哪些事情厦瓢,僅僅是單純的一個循環(huán)嗎提揍,有什么優(yōu)化呢?
二旷痕、runloop的基本作用
程序運行的過程中碳锈,當沒有任何交互的時候,我們希望程序欺抗,處于休眠狀態(tài),不進行任何的處理强重,僅僅是停留在最后一次顯示的界面中绞呈。當用戶點擊界面進行操作的時候,激活程序间景,執(zhí)行任務佃声,那么runloop可以大概有一下幾個作用
1.保持程序的運行狀態(tài)
2.處理app的各種事件
3.節(jié)省cpu的資源,提高程序的性能倘要。該做事的時候圾亏,做事,該休息的時候休息
三封拧、runloop的數(shù)據(jù)結構
oc中runloop有兩套API
C語言的API CFRunLoopRef ,C語音的runloop 是開源的志鹃,下載地址 https://opensource.apple.com/tarballs/CF/
OC語言的API NSRunLoop,它是對C語言的一層封裝泽西,為OC對象
1.runloop的獲取方法
C
CFRunLoopRef runloop = CFRunLoopGetCurrent();
OC
NSRunLoop *currentRunloop = [NSRunLoop currentRunLoop];
2.runloop相關的類
1.CFRunLoopRef 是C語言的__CFRunLoop結構體類型
2.CFRunLoopModeRef 是C語言的 __CFRunLoopMode結構體類型曹铃,內部包含 source/timer/observer等
3.CFRunLoopSourceRef 主要用于系統(tǒng)事件
4.CFRunLoopTimerRef 定時器相關
5.CFRunLoopObserverRef 通知相關
四、runloop與線程的關系
1.每條線程都有唯一一個runloop與之對應捧杉,保存在一個全局的字典中陕见,以線程為key,runloop為value
2.runloop是在第一次獲取的時候創(chuàng)建味抖,子線程中的runloop默認是沒有開啟的评甜,因為我們沒有獲取過它
3.主線程中的runloop 是已經(jīng)創(chuàng)建好了,因為在UIApplicationMain入口函數(shù)中仔涩,獲取的時候創(chuàng)建好了
4.runloop在線程結束的時候銷毀
關于runloop更多的內容忍坷,還是需要從源碼入手。了解更多的runloop知識,深刻理解承匣,有助于開發(fā)中蓖乘,關于runloop的應用。