runloop詳解

  1. ios main函數(shù):UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]))傳遞nil相當(dāng)于傳遞@“UIApplication”
    死循環(huán)--Runloop 循環(huán)

  2. runloop:
    不是蘋果所特有的,ios,macos都有
    目的:
    保證當(dāng)前線程不退出。
    負(fù)責(zé)監(jiān)聽事件,ios中網(wǎng)絡(luò)事件,觸摸事件,時鐘
    runloop模式:
    默認(rèn)模式-NSDefaultRunLoopMode、UI模式-UITrackingRunLoopModel、占位模式(默認(rèn)&&UI模式)NSRunLoopCommonModes
    ui模式的特點(diǎn):RunLoop會優(yōu)先處理UI模式下的事件,UI模式只能夠被UI事件所喚醒!!
    runloop優(yōu)先處理UI事件
    默認(rèn)模式:source、observer、timer
    UI模式:source、observer、timer(拖拽UI影響主線的runloop),拖拽屏幕UI模式被喚醒,ui模式處理事件
    如果timer事件添加在默認(rèn)模式,在有UI操作時,timer事件會被掛起,如果添加在UI模式,只有在ui操作的時候timer事件才會執(zhí)行,如果想在UI操作和不操作情況下都處理Timer事件,可以在默認(rèn)模式和UI模式都添加timer事件,為了代碼簡介,蘋果提供了占位模式。

  3. 在NSTimer中執(zhí)行耗時錯做
    [NSThreadsleepTimeInterval:1.0]
    耗時操作放子線程
    // 開一個子線程
    NSThread* thread = [NSTread allocl] initWithBlock:^{
    // block里面放耗時操作
    }

4.作為屬性,強(qiáng)引用,會保住NSThread OC對象的命
線程走沒有走和NSThtead對象沒有關(guān)系,線程由cpu調(diào)度,一個強(qiáng)引用的對象沒有辦法保住線程的名。NSThread OC對象不是線程,NSThread對象用來控制線程。NSthread對象不是線程。
cpu執(zhí)行完線程上的任務(wù)會把線程丟到線程池,線程就釋放了;
線程對象不退出NSthread對象就不會釋放,讓線程由執(zhí)行不完的任務(wù)就行了。
runloop可以從事件隊(duì)列中取事件執(zhí)行,每條線程上都有一個runloop,在第一次獲取runloop的時候創(chuàng)建,懶加載的;
runloop被創(chuàng)建出來后,并不糊運(yùn)行,需要手動的Run //開啟run意味著開啟循環(huán),死循環(huán);通過run用oc的方法就不能停止了。
runloop啟動還有一個方法可以指定啟動的時間[[NSRunLoop currentRunLoop] runUntilDate:]
[NSTread exit] 退出主線程后,子線程還在執(zhí)行任務(wù),界面卡住了。

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

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

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