RunLoop實際上是一個對象筐乳,這個對象在循環(huán)中用來處理程序運行過程中出現(xiàn)的各種事件(觸摸事件隘马、UI刷新事件野宜、定時器事件扫步、Selector事件),從而保持程序的持續(xù)運行匈子;而且在沒有事件處理的時候河胎,會進入睡眠模式,從而節(jié)省CPU資源虎敦,提高程序性能游岳。
1. 一條線程對應一個RunLoop對象政敢,每條線程都有唯一一個與之對應的RunLoop對象。
2. 我們只能在當前線程中操作當前線程的RunLoop胚迫,而不能去操作其他線程的RunLoop喷户。
3. RunLoop對象在第一次獲取RunLoop時創(chuàng)建,銷毀則是在線程結(jié)束的時候访锻。
4. 主線程的RunLoop對象系統(tǒng)自動幫助我們創(chuàng)建好了(原理如下)褪尝,而子線程的RunLoop對象需要我們主動創(chuàng)建。
從上圖中可以看出期犬,RunLoop就是線程中的一個循環(huán)河哑,RunLoop在循環(huán)中會不斷檢測,通過Input sources(輸入源)和Timer sources(定時源)兩種來源等待接受事件龟虎;然后對接受到的事件通知線程進行處理璃谨,并在沒有事件的時候進行休息。
RunLoop原理:
簡單示例代碼:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self runloopDemo2];
}
- (void)runloopDemo2 {
// 創(chuàng)建觀察者
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(CFAllocatorGetDefault(), kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
NSLog(@"監(jiān)聽到RunLoop發(fā)生改變---%zd",activity);
});
// 添加觀察者到當前RunLoop中
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);
// 釋放observer遣总,最后添加完需要釋放掉
CFRelease(observer);
}
- (void)runloopDemo1 {
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(run:) userInfo:nil repeats:YES];
// 將定時器添加到當前RunLoop的NSDefaultRunLoopMode下
[[NSRunLoop currentRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
}
- (void)run:(NSTimer *)timer {
NSLog(@"---run");
}
以上就是runloop簡單介紹睬罗。