###用runloop解決cpu空轉安全
CPU調度線程工做的時候,其中每個線程都是一個runloop。 也就是若是有任務的時候,runloop會讓線程執行任務,沒有任務時候會讓runloop休眠。 換句話說,那什麼是一個runloop?一個UI事件,一個timer,一個系統delegate都稱之爲runloop(不是NSRunloop), runloop其實是從接收消息,而後處理完消息的一個完整過程。runloop使線程進入一個循環。
###runloop運行模式異步
一種Runloop運行模式,就是一個要監控的Input和Timer事件源的集合或者是一個要通知的Runloop觀察者的集合。
###瞭解設置模式oop
NSDefaultRunLoopMode:默認的運行模式,用於大部分操做,除了NSConnection對象事件。 NSConnectionReplyMode:用來監控NSConnection對象的回覆的,不多可以用到。 NSModalPanelRunLoopMode:用於標明和Mode Panel相關的事件。 NSEventTrackingRunLoopMode:用於跟蹤觸摸事件觸發的模式(例如UIScrollView上下滾動)。 NSRunLoopCommonModes:是一個模式集合,當綁定一個事件源到這個模式集合的時候就至關於綁定到了集合內的每個模式。 Cocoa應用默認包含Default、Panel、Event Tracking模式,Core Foundation只包含Default模式, 咱們能夠經過CFRunLoopAddCommonMode添加模式。
###runloop在哪裏線程
主線程的NSRunloop默認自動運行,因此只有第二線程才須要咱們本身運行NSRunloop。 並非全部使用線程的狀況都要運行NSRunloop,下面一些狀況你須要運行NSRunloop: 須要使用Port或者自定義Input Source與其餘線程進行通信。 須要在線程中使用Timer。 須要在線程上使用performSelector*****方法。 須要讓線程執行週期性的工做。 NSURLConnection在子線程中發起異步請求。 注意: 基於Cocoa的接口不是線程安全的,基於Core Foundation的接口是線程安全的。
###使用方法code
[NSThread detachNewThreadSelector:@selector(loadPageInBackground:)toTarget:self withObject:nil]; [NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
###換起runloop的三種方式orm
1.NSRunloop 2.runloop 3.AutoreleasePool
###額外瞭解對象
每個Runloop, 系統會隱式建立一個Autorelease pool,這樣全部的release pool會構成一個象CallStack同樣的一個棧式結構, 在每個Runloop結束時,當前棧頂的Autorelease pool會被銷燬,這樣這個pool裏的每一個Object會被release