iOS筆記/復(fù)習(xí)筆記
RunLoop基本作用
- 保持程序持續(xù)運(yùn)行下硕;
- 處理App各種事件丁逝;
- 節(jié)省CPU資源,提高程序性能梭姓;
RunLoop和線程的關(guān)系
- 每條線程都有唯一的一個(gè)與之對(duì)應(yīng)的RunLoop對(duì)象霜幼;
- RunLoop保存在一個(gè)全局的Dictionary里,線程作為key,RunLoop作為value誉尖;
- 主線程的RunLoop已經(jīng)自動(dòng)創(chuàng)建好了罪既,子線程的RunLoop需要主動(dòng)創(chuàng)建;
- RunLoop在第一次獲取時(shí)創(chuàng)建铡恕,在線程結(jié)束時(shí)銷毀琢感;
RunLoop的mode(運(yùn)行模式)
一個(gè) RunLoop 包含若干個(gè) Mode,每個(gè)Mode又包含若干個(gè)Source探熔、Timer驹针、Observer
每次RunLoop啟動(dòng)時(shí),只能指定其中一個(gè) Mode诀艰,這個(gè)Mode被稱作 CurrentMode
如果需要切換Mode柬甥,只能退出RunLoop,再重新指定一個(gè)Mode進(jìn)入其垄,這樣做主要是為了分隔開(kāi)不同組的Source苛蒲、Timer、Observer绿满,讓其互不影響臂外。如果Mode里沒(méi)有任何Source0/Source1/Timer/Observer,RunLoop會(huì)立馬退出
系統(tǒng)默認(rèn)注冊(cè)的5個(gè)Mode:
- kCFRunLoopDefaultMode:App的默認(rèn)Mode,通常主線程是在這個(gè)Mode下運(yùn)行
- UITrackingRunLoopMode:界面跟蹤 Mode漏健,用于 ScrollView 追蹤觸摸滑動(dòng)辜膝,保證界面滑動(dòng)時(shí)不受其他 Mode 影響
- UIInitializationRunLoopMode: 在剛啟動(dòng) App 時(shí)第進(jìn)入的第一個(gè) Mode,啟動(dòng)完成后就不再使用漾肮,會(huì)切換到kCFRunLoopDefaultMode
- GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的內(nèi)部 Mode厂抖,通常用不到
- kCFRunLoopCommonModes: 這是一個(gè)占位用的Mode忱辅,作為標(biāo)記kCFRunLoopDefaultMode和UITrackingRunLoopMode用谭溉,并不是一種真正的Mode
Source1/Source0/Timers/Observer分別代表什么
- Source1 : 基于Port的線程間通信
- Source0 : 觸摸事件,PerformSelectors
- Timers : 定時(shí)器损搬,NSTimer
- Observer : 監(jiān)聽(tīng)器柜与,用于監(jiān)聽(tīng)RunLoop的狀態(tài)
RunLoop的的運(yùn)行狀態(tài)
- kCFRunLoopEntry: 進(jìn)入RunLoop
- kCFRunLoopBeforeTimers: 即將處理timers
- kCFRunLoopBeforeSources: 即將處理Sources
- kCFRunLoopBeforeWaiting: 即將休息
- kCFRunLoopAfterWaiting:即將被喚醒
- kCFRunLoopExit: 退出RunLoop
RunLoop處理邏輯流程圖
1434508-d448ec1fc5171e09.png