深刻淺出 RunLoop(一):初識

RunLoop 系列文章

深刻淺出 RunLoop(一):初識
深刻淺出 RunLoop(二):數據結構
深刻淺出 RunLoop(三):事件循環機制
深刻淺出 RunLoop(四):RunLoop 與線程
深刻淺出 RunLoop(五):RunLoop 與 NSTimer
深刻淺出 RunLoop(六):相關面試題html

RunLoop 簡介

  • 運行循環,在程序運行過程當中循環作一些事情(如接收消息、處理消息、休眠等待等);
  • RunLoop是經過內部維護的事件循環來對事件/消息進行管理的一個對象;
  • RunLoop不是一個簡單的do...while循環,它涉及到用戶態和內核態之間的切換。

事件循環

事件循環就是對事件/消息進行管理,事件循環能夠達到:面試

  • 沒有消息須要處理時,休眠線程以免資源佔用。從用戶態切換到內核態,等待消息;
  • 有消息須要處理時,馬上喚醒線程,回到用戶態處理消息;
  • 經過調用mach_msg()函數來轉移當前線程的控制權給內核態/用戶態。

RunLoop 的基本做用

  • 保持程序的持續運行:
    若是沒有RunLoopmain()函數一執行完,程序就會馬上退出。
    而咱們的 iOS 程序能保持持續運行的緣由就是在main()函數中調用了UIApplicationMain函數,這個函數內部會啓動主線程的RunLoop
  • 處理 App 中的的各類事件(好比觸摸事件、定時器事件等);
  • 節省 CPU 資源,提升程序性能:該作事時作事,該休息時休息。

RunLoop 的應用範疇

  • 定時器(Timer)、PerformSelector
  • GCD:dispatch_async(dispatch_get_main_queue(), ^{ });
  • 事件響應、手勢識別、界面刷新
  • 網絡請求
  • AutoreleasePool

RunLoop 對象

  • iOS 中有 2 套 API 來訪問和使用RunLoop
    ① Foundation:NSRunLoop(是CFRunLoopRef的封裝,提供了面向對象的 API)
    ② Core Foundation:CFRunLoopRef
  • NSRunLoopCFRunLoopRef都表明着RunLoop對象
  • NSRunLoop不開源,而CFRunLoopRef是開源的:Core Foundation 源碼
  • 獲取RunLoop對象的方式:
// Foundation
    [NSRunLoop mainRunLoop];     // 獲取主線程的 RunLoop 對象
    [NSRunLoop currentRunLoop];  // 獲取當前線程的 RunLoop 對象
    // Core Foundation
    CFRunLoopGetMain();     // 獲取主線程的 RunLoop 對象
    CFRunLoopGetCurrent();  // 獲取當前線程的 RunLoop 對象
複製代碼

RunLoop 在實際開發中的應用

  • 使用端口或自定義輸入源與其餘線程進行通訊
  • 在子線程上使用定時器
  • 解決NSTimer在滑動時中止工做的問題
  • 控制線程的生命週期,實現一個常駐線程
  • 在 Cocoa 應用程序中使用任何performSelector...方法
  • 監控應用卡頓
  • 性能優化
  • ......

相關連接

Core Foundation 源碼
蘋果官方文檔 RunLoop性能優化

相關文章
相關標籤/搜索