ios main函數(shù):UIApplicationMain(argc,argv,nil,NSStringFromClass([AppDelegate class]))傳遞nil相當(dāng)于傳遞@“UIApplication”
死循環(huán)--Runloop 循環(huán)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事件,為了代碼簡介,蘋果提供了占位模式。在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ù),界面卡住了。