沒有Runloop:
代碼執(zhí)行完畢后牍疏,直接執(zhí)行return 0箍铲。程序執(zhí)行結(jié)束菩收。
有Runloop:
程序并不會馬上退出,而是保持運(yùn)行狀態(tài)
基本作用:
保持程序的持續(xù)運(yùn)行
處理App中的各種事件
節(jié)省CPU資源鲸睛,提高程序性能
當(dāng)有事件來的時候就處理娜饵,完成后就為0,繼續(xù)睡眠官辈。
RunLoop與線程
一條線程對應(yīng)一個RunLoop對象
保存方式是 保存在全局的字典當(dāng)中箱舞,以線程為Key,對象為value
生命周期:生->線程創(chuàng)建時拳亿,RunLoop第一次被獲取的時候創(chuàng)建對象
死->當(dāng)線程結(jié)束時被銷毀
主線程一開始就有RunLoop , 子線程默認(rèn)沒有被開啟晴股。
模式:
一個RunLoop對象有若干個Mode,每個Mode又包含若干個Source0/Source1/Timer/Observer
RunLoop啟動時只能選擇其中一個Mode肺魁,作為currentMode
如果需要切換Mode电湘,只能退出當(dāng)前Loop,再重新選擇一個Mode進(jìn)入
不同組的Source0/Source1/Timer/Observer能分隔開來鹅经,互不影響
如果Mode里沒有任何Source0/Source1/Timer/Observer寂呛,RunLoop會立馬退出
常見的2種Mode
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默認(rèn)Mode,通常主線程是在這個Mode下運(yùn)行
(默認(rèn)模式)
UITrackingRunLoopMode:界面跟蹤 Mode瘾晃,用于 ScrollView 追蹤觸摸滑動贷痪,保證界面滑動時不受其他 Mode 影響
(滑動模式)
執(zhí)行流程圖
執(zhí)行邏輯:所謂的執(zhí)行邏輯就是
你不做事,這個App開著其實(shí)是在休眠的蹦误,CPU沒有運(yùn)行劫拢。
但是你一做事情肉津,或收到消息,RunLoop就會接受到事件舱沧,去處理一些事情妹沙。
處理完以后,再次進(jìn)入到休眠中狗唉,一直循環(huán)初烘。
休眠的細(xì)節(jié)
使用底層代碼使CPU停止,而不是使用While循環(huán)分俯,這樣保證CPU不處理程序的任務(wù)肾筐,完全的休眠。
等有消息的時候在喚醒線程
Runloop 是怎么響應(yīng)用戶操作的缸剪, 具體流程是什么樣的吗铐?
Source1 捕捉事件
Source0 處理事件
程序中添加每3秒響應(yīng)一次的NSTimer,當(dāng)拖動Tableview時timer可能無法響應(yīng)要怎么解決?
將NSTimer加入到RunLoop對象中去杏节,設(shè)置common模式唬渗。
Timer與RunLoop的關(guān)系。RunLoop里面有Mode,而mode里面有Timer.
當(dāng)Timer設(shè)置common模式時奋渔,
結(jié)構(gòu)
// 模式
//1. Name 模式名字
//2. 處理者
//3. 捕捉者
//4. 如果添加了觀察者镊逝,在這里存放
//5. 存放這個模式能夠使用的計時器
//RunLoop 對象
// 1.所在線程
// 2.通用模式,如果有計時器被設(shè)置了通用模式嫉鲸,那么這個里面就裝著有的對象可以同時多個模式被使用撑蒜。
// 3.通用模式對象, 存放在這個集合中的對象能夠被設(shè)置為通用模式
// 4.當(dāng)前使用的模式
// 5.所有模式