1.何為runloop蕉朵,有什么用?
runloop 就是一個運行循環(huán)阳掐,用于保持程序的持續(xù)運行始衅,處理各種事件(觸摸事件,定時器等)缭保,節(jié)省cpu資源汛闸,提高性能(要讓馬兒跑,還要馬兒不吃草)
2.runloop的用法艺骂?
oc中有兩套API可以訪問和使用runloop
(1)Foundation
NSRunloop
//獲取當前線程的runloop
[NSRunloop currentRunloop];
//獲取主前程的runloop
[NSRunloop mainRunloop];
(2)Core Foundation
CFRunloopRef
CFRunLoopGetCurrent(); // 獲得當前線程的RunLoop對象CFRunLoopGetMain(); // 獲得主線程的RunLoop對象
3.線程與runloop
(1).每條線程都有唯一的與之對應(yīng)的RunLoop對象诸老。
(2).主線程的RunLoop已經(jīng)創(chuàng)建好了,而子線程的需要手動創(chuàng)建钳恕。(也就是說子線程的RunLoop默認是關(guān)閉的别伏,因為有時候開了個線程但卻沒有必要開一個RunLoop蹄衷,不然反而浪費了資源。 )
(3).RunLoop在第一次獲取時創(chuàng)建厘肮,在線程結(jié)束時銷毀愧口。
4.RunLoop相關(guān)類
CFRunLoopRef ? ? ? ? ? ? ? ?//
CFRunLoopModeRef ? ? ?//RunLoop的運行模式。
CFRunLoopSourceRef
CFRunLoopTimerRef
CFRunLoopObserverRef
1.CFRunLoopModeRef代表的是RunLoop的運行模式轴脐。
2.一個 RunLoop 包含若干個 Mode调卑,每個 Mode 又包含若干個 Source/Timer/Observer。
3.每次調(diào)用 RunLoop 的主函數(shù)時大咱,只能指定其中一個 Mode恬涧,這個Mode被稱作 CurrentMode。 4.如果需要切換 Mode碴巾,只能退出 Loop溯捆,再重新指定一個 Mode 進入。這樣做主要是為了分隔開不同組的 Source/Timer/Observer厦瓢,讓其互不影響提揍。?
CFRunLoopModeRef
kCFRunLoopDefaultMode //App的默認Mode,通常主線程是在這個Mode下運行
UITrackingRunLoopMode //界面跟蹤 Mode煮仇,用于 ScrollView 追蹤觸摸滑動劳跃,保證界面滑動時不受其他 Mode 影響
UIInitializationRunLoopMode // 在剛啟動 App 時第進入的第一個 Mode,啟動完成后就不再使用
GSEventReceiveRunLoopMode // 接受系統(tǒng)事件的內(nèi)部 Mode浙垫,通常用不到
kCFRunLoopCommonModes //這是一個占位用的Mode刨仑,不是一種真正的Mode ?
5.使用runloop注意點
在NSTimer中使用runloop 是時的用法
- (IBAction)ButtonDidClick:(id)sender {
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerTest) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
}
- (void)timerTest {
NSLog(@"timerTest----");
}
在scrollview中使用runloop時的用法:使用NSRunLoopCommonModes
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(timerTest) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
參考鏈接:http://www.reibang.com/p/2d3c8e084205