iOS RunLoop(1)RunLoop簡介

iOS RunLoop(1)RunLoop簡介
iOS RunLoop(2)RunLoop相關類
iOS RunLoop(3)RunLoop原理
iOS RunLoop(4)RunLoop實戰(zhàn)應用

RunLoop簡介

什么是RunLoop抑片?

可以理解為字面意思:Run表示運行欢唾,Loop表示循環(huán)补箍。結合在一起就是運行的循環(huán)的意思既峡。哈哈嚎莉,我更愿意翻譯為『跑圈』球订。直觀理解就像是不停的跑圈瞬浓。

RunLoop實際上是一個對象舀武,這個對象在循環(huán)中用來處理程序運行過程中出現(xiàn)的各種事件(比如說觸摸事件、UI刷新事件骏啰、定時器事件节吮、Selector事件),從而保持程序的持續(xù)運行判耕;而且在沒有事件處理的時候透绩,會進入睡眠模式,從而節(jié)省CPU資源壁熄,提高程序性能帚豪。

RunLoop和線程

首先,iOS 開發(fā)中能遇到兩個線程對象: pthread_t 和 NSThread草丧。過去蘋果有份文檔標明了 NSThread 只是 pthread_t 的封裝狸臣,但那份文檔已經失效了,現(xiàn)在它們也有可能都是直接包裝自最底層的 mach thread昌执。蘋果并沒有提供這兩個對象相互轉換的接口烛亦,但不管怎么樣诈泼,可以肯定的是 pthread_t 和 NSThread 是一一對應的。比如此洲,你可以通過 pthread_main_thread_np() 或 [NSThread mainThread] 來獲取主線程厂汗;也可以通過 pthread_self() 或 [NSThread currentThread] 來獲取當前線程。CFRunLoop 是基于 pthread 來管理的呜师。

蘋果不允許直接創(chuàng)建 RunLoop娶桦,它只提供了兩個自動獲取的函數(shù):CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。

一條線程對應一個RunLoop對象汁汗,每條線程都有唯一一個與之對應的RunLoop對象衷畦。

我們只能在當前線程中操作當前線程的RunLoop,而不能去操作其他線程的RunLoop知牌。

RunLoop對象在第一次獲取RunLoop時創(chuàng)建祈争,銷毀則是在線程結束的時候。

主線程的RunLoop對象系統(tǒng)自動幫助我們創(chuàng)建好了(原理如下)角寸,而子線程的RunLoop對象需要我們主動創(chuàng)建菩混。

默認情況下主線程的RunLoop原理

我們在啟動一個iOS程序的時候,系統(tǒng)會調用創(chuàng)建項目時自動生成的main.m的文件扁藕。main.m文件如下所示:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

其中UIApplicationMain函數(shù)內部幫我們開啟了主線程的RunLoop沮峡,UIApplicationMain內部擁有一個無線循環(huán)的代碼。上邊的代碼中開啟RunLoop的過程可以簡單的理解為如下代碼:

int main(int argc, char * argv[]) {        
    BOOL running = YES;
    do {
        // 執(zhí)行各種任務亿柑,處理各種事件
        // ......
    } while (running);

    return 0;
}

從上邊可看出邢疙,程序一直在do-while循環(huán)中執(zhí)行,所以UIApplicationMain函數(shù)一直沒有返回望薄,我們在運行程序之后程序不會馬上退出疟游,會保持持續(xù)運行狀態(tài)。

下圖是蘋果官方給出的RunLoop模型圖痕支。
runLoop.jpg

從上圖中可以看出颁虐,RunLoop就是線程中的一個循環(huán),RunLoop在循環(huán)中會不斷檢測卧须,通過Input sources(輸入源)和Timer sources(定時源)兩種來源等待接受事件聪廉;然后對接受到的事件通知線程進行處理,并在沒有事件的時候進行休息故慈。

文章來源:
http://www.reibang.com/p/d260d18dd551
https://blog.ibireme.com/2015/05/18/runloop/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市框全,隨后出現(xiàn)的幾起案子察绷,更是在濱河造成了極大的恐慌,老刑警劉巖津辩,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拆撼,死亡現(xiàn)場離奇詭異容劳,居然都是意外死亡,警方通過查閱死者的電腦和手機闸度,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門竭贩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人莺禁,你說我怎么就攤上這事留量。” “怎么了哟冬?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵楼熄,是天一觀的道長。 經常有香客問我浩峡,道長可岂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任翰灾,我火速辦了婚禮缕粹,結果婚禮上,老公的妹妹穿的比我還像新娘纸淮。我一直安慰自己平斩,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布萎馅。 她就那樣靜靜地躺著双戳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糜芳。 梳的紋絲不亂的頭發(fā)上飒货,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音峭竣,去河邊找鬼塘辅。 笑死,一個胖子當著我的面吹牛皆撩,可吹牛的內容都是我干的扣墩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扛吞,長吁一口氣:“原來是場噩夢啊……” “哼呻惕!你這毒婦竟也來了?” 一聲冷哼從身側響起滥比,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亚脆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后盲泛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體濒持,經...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡键耕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柑营。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屈雄。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖官套,靈堂內的尸體忽然破棺而出酒奶,到底是詐尸還是另有隱情,我是刑警寧澤虏杰,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布讥蟆,位于F島的核電站,受9級特大地震影響纺阔,放射性物質發(fā)生泄漏瘸彤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一笛钝、第九天 我趴在偏房一處隱蔽的房頂上張望质况。 院中可真熱鬧,春花似錦玻靡、人聲如沸结榄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼朗。三九已至,卻和暖如春蝎土,著一層夾襖步出監(jiān)牢的瞬間视哑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工誊涯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挡毅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓暴构,卻偏偏與公主長得像跪呈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子取逾,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內容