中高級iOS必備知識點之 RunLoop

收錄:原文地址
獲取更多資料

RunLoop簡介

Run 表示運行捍靠,Loop 表示循環(huán)性湿。結(jié)合在一起就是運行循環(huán)的意思。RunLoop就是在程序運行過程中循環(huán)做一些事情。主要應用于以下:
定時器(Timer)统诺、PerformSelector

GCD Async Main Queue

事件響應续徽、手勢識別弟劲、界面刷新

網(wǎng)絡請求

AutoreieasePool

沒有RunLoop支撐,上面的這些都無法實現(xiàn).

作用

1.保持程序的持續(xù)運行

2.處理App中的各種事件(比如觸摸事件叮姑、定時器事件等)

3.節(jié)省了CPU資源,提高程序性能:該做事時做事,該休息時休息

獲取RunLoop對象

iOS中有2套API來訪問和使用RunLoop :

Foundation : NSRunLoop (OC語言里面的)

Core Foundation : CFRunLoopRef (C語言里面的)

NSRunLoop和CFRunLoopRef都代表著RunLoop對象

NSRunLoop是基于CFRunLoopRef的一層OC包裝

CFRunLoopRef是開源的.(CFRunLoopRef參考鏈接)

其實我們很多都是由OC包裝出來的,請看下面:


e4ae84d37719c2a328faee3b9d8ff11b.png

獲取當前的RunLoop

獲取當前RunLoop和主線程RunLoop


79a770b59cd190401bbc1c0e3e6d8b96.png

獲取RunLoop

這里注意,地址不一樣,因為NSRunLoop是對CFRunLoopDef做了一層包裝,你可以用OC的NSLog("%@",[NSRunLoop MainRunLoop])獲取對比一下,它的地址就是C語言獲取的地址.主線程只有一個RunLoop.

RunLoop與線程

每條線程都有唯一的一個與之對應的RunLoop對象(一一對應)

RunLoop保存在一個全局的Dictionary里,線程作為key,RunLoop作為value

線程剛創(chuàng)建的時候并沒有RunLoop對象,RunLoop會在第一次獲取它時創(chuàng)建

RunLoop會在線程結(jié)束時銷毀

主線程的RunLoop已經(jīng)自動創(chuàng)建,子線程默認沒有開啟RunLoop.


image

源碼窺探看一下:CFRunLoopGetCurrent

由于源碼不能像objc直接打開,我們把它拉到項目中查看.


image

image

從字典也能看出來是一對一的關系.而且確實是第一次獲取的時候是空的,然后再去創(chuàng)建這個RunLoop.

那我們就繼續(xù)來了解RunLoop內(nèi)部的數(shù)據(jù)結(jié)構(gòu),到底是怎么工作的.

RunLoop相關的類

Core Foundation中關于RunLoop的5個類

1.CFRunLoopRef

2.CFRunLoopModeRef

3.CFRunLoopSourceRef

4.CFRunLoopTimerRef

5.CFRunLoopObserverRef

再看下CFRunLoopRef的底層源碼:


image

就是上面這個結(jié)構(gòu)體,我們用到的可能就是紅色這些.pthread是線程,每個runloop都會保存這個東西.最后面那個_modes,這個是個集合來著,CFMutableSetRef我們能想到我們自己用的set也是一個集合來著,比如NSMutableSet也是一個集合,所以這個_modes里面是存著一堆的mode.

這個mode就是CFRunLoopModeRef類型,所以里面存儲一堆的CFRunLoopModeRef類型的mode.

而_currentMode也是CFRunLoopModeRef這個類型,所以我們很容易得出一個結(jié)論:

一個RunLoop對象里面有一堆的mode,也就是存在_modes里面,里面只有一個是_currentMode.
我們再窺探一下源碼,看下mode里面存儲的是什么?

image

所以我們來個總結(jié)的圖:
image

RunLoop有很多種模式,對應的_currentMode只有一種.

CFRunLoopModeRef

1.CFRunLoopModeRef它是代表RunLoop的運行模式

2.一個RunLoop包含若干個Mode,每個Mode又包含若干個Source0/Source1/Timer/Observer

3.RunLoop啟動時只能選擇其中一個Mode,作為currentMode

4.如果需要切換Mode,只能退出當前RunLoop,再重新選擇一個Mode進入

5.不同組的Source0/Source1/Timer/Observer能分割開來,互不影響

6.如果Mode里面沒有任何Source0/Source1/Timer/Observer,RunLoop會立馬退出

如果只能在一種模式下運行,對性能什么的都有很大好處,比如我在滑動模式下,不考慮不滑動的模式,所以就不會卡頓,順暢很多.還有注意的就是,它切換mode是在循環(huán)里面切換的,所以不會導致程序退出.

常見的mode有2種,其他情況很少見,所以掌握這兩個一般都是沒問題了

1.KCFRunLoopDefaultMode (NSDefaultRunLoopMode):App的默認Mode,通常是主線程是在這個Mode下運行

2.UITrackingRunLoopMode : 界面跟蹤Mode,用于ScrollView追蹤觸摸滑動,保證界面滑動時不受其他Mode影響

RunLoop到底做哪些事?

RunLoop在不停執(zhí)行的時候到底具體做了哪些事?其實是RunLoop在不停循環(huán)的時候,就是處理每個mode下的Source0、Source1砾脑、Timer幼驶、Observer這里面的事件,那我們就來看看這里面具體對應的到底是什么事件.

Source0

觸摸事件、performSelector:onThread:

比如我們的touchbegin這個我們看下下面的代碼:


image

Source1

基于Port的線程間的通信,系統(tǒng)事件的捕捉.

(兩個線程之間相互傳遞消息的處理,系統(tǒng)事件捕捉,其實也包括觸摸事件,只是把事件捕捉到以后傳遞給Source0).

Timer

NSTimer定時器,performSelector:withObject:afterDelay(這個方法的底層實現(xiàn)也就是NSTimer來實現(xiàn)的)

Observers

用于監(jiān)聽RunLoop的狀態(tài),UI的刷新(BeforeWaiting),Autorelease pool(BeforeWaiting)

(在RunLoop休眠之前都會去執(zhí)行UI的刷新啊韧衣、Autorelease pool的釋放等)

以上這些東西,完全就是我們平時開發(fā)中經(jīng)常寫的代碼,比如設置背景色,設置frame等等.

盅藻,iOS技術(shù)交流群: 711315161,大家一起交流學習畅铭。群內(nèi)有許多技術(shù)大牛氏淑,高手如云,有任何問題顶瞒,歡迎廣大網(wǎng)友一起來交流夸政,群內(nèi)還不定期免費分享中高階iOS學習視頻資料和面試資料包~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榴徐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匀归,老刑警劉巖坑资,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異穆端,居然都是意外死亡袱贮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門体啰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒巍,“玉大人,你說我怎么就攤上這事荒勇∑饫颍” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵沽翔,是天一觀的道長兢孝。 經(jīng)常有香客問我窿凤,道長,這世上最難降的妖魔是什么跨蟹? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任雳殊,我火速辦了婚禮,結(jié)果婚禮上窗轩,老公的妹妹穿的比我還像新娘夯秃。我一直安慰自己,他們只是感情好痢艺,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布仓洼。 她就那樣靜靜地躺著,像睡著了一般腹备。 火紅的嫁衣襯著肌膚如雪衬潦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天植酥,我揣著相機與錄音镀岛,去河邊找鬼。 笑死友驮,一個胖子當著我的面吹牛漂羊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卸留,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼走越,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耻瑟?” 一聲冷哼從身側(cè)響起旨指,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喳整,沒想到半個月后谆构,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡框都,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年搬素,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魏保。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡熬尺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谓罗,到底是詐尸還是另有隱情粱哼,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布妥衣,位于F島的核電站皂吮,受9級特大地震影響戒傻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜂筹,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一需纳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艺挪,春花似錦不翩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至津坑,卻和暖如春妙蔗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疆瑰。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工眉反, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人穆役。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓寸五,卻偏偏與公主長得像,于是被迫代替她去往敵國和親耿币。 傳聞我的和親對象是個殘疾皇子梳杏,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容