1、什么是RunLoop?
2、開發中如何使用RunLoop?什么應用場景?
3、RunLoop和線程有什么關系?
4、RunLoop的Mode作用是什么?
5、RunLoop的實現原理和數據結構,什么時候會用到?
6、RunLoop的基本概念,它是什么時候休眠的?
7、自動釋放池在什么時刻釋放(一個autorelease對象在什么時候釋放)?
8、objc使用什么機制管理內存對象?
9、猜想runloop內部是如何實現的?
參考答案
1、什么是 Runloop?
從字面上講就是運行循環。
它內部就是do-while循環,在這個循環內部不斷地處理各種任務。
一個線程對應一個RunLoop,主線程的RunLoop默認已經啟動,子線程的RunLoop得手動啟動(調用run方法)
RunLoop只能選擇一個Mode啟動,如果當前Mode中沒有任何Source(Sources0、Sources1)、Timer,那么就直接退出RunLoop
基本的作用就是保持程序的持續運行,處理app中的各種事件。通過runloop,有事運行,沒事就休息,可以節省cpu資源,提高程序性能。
Runloop對象
iOS中有2套API來訪問和使用RunLoop
Foundation:NSRunLoop
Core Foundation:CFRunLoopRef
NSRunLoop和CFRunLoopRef都代表著RunLoop對象
NSRunLoop是基于CFRunLoopRef的一層OC包裝,所以要了解RunLoop內部結構,需要多研究CFRunLoopRef層面的API。
3、Runloop與線程
每條線程都有唯一的一個與之對應的RunLoop對象
主線程的RunLoop已經自動創建好了,子線程的RunLoop需要主動創建
RunLoop在第一次獲取時創建,在線程結束時銷毀
獲得RunLoop對象
Foundation
[NSRunLoop currentRunLoop]; // 獲得當前線程的RunLoop對象
[NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象
Core Foundation
CFRunLoopGetCurrent(); // 獲得當前線程的RunLoop對象
CFRunLoopGetMain(); // 獲得主線程的RunLoop對象
RunLoop相關類
Core Foundation中關于RunLoop的5個類
CFRunLoopRef
CFRunLoopModeRef
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef