iOS多線程-RunLoop

1、概念

RunLoop與線程關(guān)聯(lián)的,是一種事件處理環(huán),用來安排和協(xié)調(diào)到來的事件,目的就是讓其關(guān)聯(lián)的線程在有事件到達(dá)時(shí)時(shí)刻保持運(yùn)行狀態(tài),而當(dāng)沒有事件需要處理時(shí)進(jìn)入睡眠狀態(tài)從而節(jié)約資源,每一個(gè)線程都可以有一個(gè)RunLoop對象與之對應(yīng),并且是在第一次獲取它是系統(tǒng)自動(dòng)創(chuàng)建的,比如主線程關(guān)聯(lián)的RunLoop,我們都知道程序的入口函數(shù)是main函數(shù),下面是創(chuàng)建工程后Xcode自動(dòng)生成的main.m文件的main函數(shù)代碼:

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

該方法執(zhí)行體被autoreleasepool包圍,所以程序可以使用ARC來管理內(nèi)存,后面會(huì)講解RunLoopautoreleasepool的關(guān)系,main函數(shù)直接返回了UIApplicationMain函數(shù),該函數(shù)內(nèi)部就會(huì)第一次獲取RunLoop對象,所以系統(tǒng)就會(huì)創(chuàng)建這樣一個(gè)RunLoop對象,因此在沒有滿足特定條件的時(shí)候該主線程不會(huì)退出,應(yīng)用就可以持續(xù)運(yùn)行而不會(huì)退出。

在官方文檔中使用下圖描述RunLoop模型:

官方RunLoop圖

從上圖可以看出一個(gè)線程會(huì)關(guān)聯(lián)一個(gè)RunLoop對象,RunLoop對象會(huì)一直循環(huán),直到超時(shí)或收到退出指令。在無限循環(huán)的過程中會(huì)一直處理到來的事件,右側(cè)將事件分為了兩類,一類是Input sources這部分包括基于端口的source1事件,開發(fā)者提交的各種source0事件,調(diào)用performSelector:onThread:方法事件,還有一類Timer sources這個(gè)就是常用的定時(shí)器事件,這些事件在程序運(yùn)行期間會(huì)不斷產(chǎn)生之后會(huì)由RunLoop對象檢測并負(fù)責(zé)處理相關(guān)事件。

2、RunLoop 源碼解析

RunLoop有兩個(gè)對象,NSRunLoopCFRunLoopRef,區(qū)別在于由Core Foundation框架提供的CFRunLoopRef是純C語言編寫的,提供的也是C語言接口,這些接口都是線程安全的,由Foundation框架提供的NSRunLoop是面向?qū)ο蟮?,它是基?code>CFRunLoopRef的封裝,提供的都是面向?qū)ο蟮慕涌?,但這些接口不是線程安全的,Core Foudation框架是開源的,可以在這個(gè)地址下載:Core Foundation開源代碼,本文接下來的內(nèi)容主要是針對該開源代碼進(jìn)行講解。

首先,看一下在代碼中如何獲取RunLoop對象,在Foundation框架中的NSRunLoop類提供了如下兩個(gè)類屬性:

//獲取當(dāng)前線程關(guān)聯(lián)的RunLoop對象
@property (class, readonly, strong) NSRunLoop *currentRunLoop;
//獲取主線程關(guān)聯(lián)的RunLoop對象
@property (class, readonly, strong) NSRunLoop *mainRunLoop

對應(yīng)的Core Foundation里提供下面兩個(gè)函數(shù)來獲取RunLoop對象

//獲得當(dāng)前線程關(guān)聯(lián)的RunLoop對象
CFRunLoopGetCurrent(); 
// 獲得主線程關(guān)聯(lián)的RunLoop對象
CFRunLoopGetMain();

具體細(xì)節(jié)可以查閱這里:深入理解RunLoop

更新時(shí)間 2018-08-27

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 RunLoop簡介 神秘的RunLoop。一個(gè)應(yīng)用開始運(yùn)行以后放在那里,如果不對它進(jìn)行任何操作,這個(gè)應(yīng)用就像靜...
    Claire_wu閱讀 1,883評論 3 30
  • 本文首發(fā)于我的個(gè)人博客:「程序員充電站」[https://itcharge.cn]文章鏈接:「傳送門」[https...
    ITCharge閱讀 61,882評論 50 541
  • RunLoop 文章目錄RunLoop 簡介1.1 什么是 RunLoop?1.2 RunLoop 和線程1.3 ...
    路飛_Luck閱讀 1,113評論 1 8
  • 什么是RunLoop 從字面意思看 運(yùn)行循環(huán) 跑圈 基本作用 保持程序的持續(xù)運(yùn)行 處理App中的各種事件(比如觸摸...
    沉夢昂志__閱讀 379評論 0 0
  • 什么是RunLoop?從字面上來看是運(yùn)行循環(huán)的意思.內(nèi)部就是一個(gè)do{}while循環(huán),在這個(gè)循環(huán)里內(nèi)部不斷的處理...
    deve_雨軒閱讀 29,602評論 1 32

友情鏈接更多精彩內(nèi)容