RunLoop回憶錄
簡介
運行循環(huán), 能夠保持程序運行, 處理app的各種事件, 節(jié)省CPU資源, 提高性能.
訪問方法
- NSRunLoop
- CFRunLoopRef
CFRunLoopRef是c語言寫的, 相比于NSRunLoop更加底層, 所以CFRunLoopRef的性能要更高一點.
RunLoop與線程
- 每條線程都有唯一的與之對應(yīng)的RunLoop對象.
- 主線程的RunLoop已經(jīng)創(chuàng)建好了, 而子線程的需要手動創(chuàng)建.
- RunLoop在第一次獲取時創(chuàng)建, 在線程結(jié)束時銷毀.
獲取RunLoop對象
Foundation:
[NSRunLoop currentRunLoop]; // 獲取當(dāng)前線程的RunLoop對象
[NSRunLoop mainRunLoop]; // 獲取主線程的RunLoop對象
Core Foundation:
CFRunLoopGetCurrent();
CFRunLoopGetMain();
RunLoop相關(guān)類
- CFRunLoopRef
- CFRunLoopModeRef
- CFRunLoopSourceRef
- CFRunLoopTimerRef
- CFRunLoopObserverRef

- 一個CFRunLoopModeRef代表的是RunLoop的運行模式
- 一個RunLoop包含若干個Mode, 每個Mode又包含若干個Source/Timer/Observer
- 每次調(diào)用RunLoop的主函數(shù)時, 只能指定其中一個Mode, 這個Mode被稱作CurrentMode
- 如果需要切換Mode, 只能退出RunLoop, 再重新指定一個Mode進(jìn)入, 這樣做是為了分隔開不同組的Source/Timer/Observer, 讓其互不影響
CFRunLoopModeRef
系統(tǒng)默認(rèn)注冊了4個mode
kCFRunLoopDefaultMode //App的默認(rèn)Mode,通常主線程是在這個Mode下運行
UITrackingRunLoopMode //界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動,保證界面滑動時不受其他 Mode 影響 UIInitializationRunLoopMode // 在剛啟動 App 時第進(jìn)入的第一個 Mode,啟動完成后就不再使用
GSEventReceiveRunLoopMode // 接受系統(tǒng)事件的內(nèi)部 Mode,通常用不到
kCFRunLoopCommonModes //這是一個占位用的Mode,不是一種真正的Mode
CFRunLoopSourceRef
是事件源, 分為兩種:
- source0: 非基于port的(port相當(dāng)于是系統(tǒng)), 響應(yīng)
- source1: 基于port的, 系統(tǒng)提供的
CFRunLoopObserverRef
是觀察者, 可以監(jiān)聽RunLoop的狀態(tài)改變監(jiān)聽的
RunLoop的應(yīng)用
- performSelector
- 常駐線程
- NSTimer
- ImageVIew的顯示, 第三方框架SDWebImage利用了RunLoop
- 自動釋放池