一:什么是Runloop(面试题:什么是RunLoop?项目中有用到吗?)
顾名思义,运行循环,在程序运行过程中循环做一些事情,应用范畴:定时器timer、PerformSelector、GCD、事件响应、手势识别、界面刷新、网络请求、AutoreleasePool,runloop的基本作用就是保持程序的持续运行,处理APP中的各种事件,接受省CPU资源,提高程序性能,该做事的时候做事,该休息的时候休息
二:runloop与线程的关系(面试题:RunLoop和线程的关系)
每个线程都有唯一一个与之对应的runloop,runloop保存在一个全局的NSDictionary中,key是线程,value是runloop,线程刚创建的时候并没有runloop,runloop会在第一次获取它的时候创建,同事runloop会在线程结束的时候销毁,主线程的runloop已经自动获取创建,子线程的runloop默认情况下没有创建
三:runloop相关的5个类(面试题:timer和RunLoop的关系)
Core Foundation中关于Runloop的5个类
1.CFRunLoopRef
2.CFRunLoopModeRef
3.CFRunLoopSourceRef
4.CFRunLoopTimerRef
5.CFRunLoopObserveRef
typedef struct __CFRunLoopRef * CFRunLoopRef
struct __CFRunLoop {
pthread_t _pthread;
CFMutableSetRef _commonModes;
CFMutableSetRef _commonModeItems;
CFRunLoopModeRef _currentModes;
CFMutableSetRef _modes
}
typedef struct __CFRunLoopMode *CFRunLoopModeRef
struct __CFRunLoopMode {
CFStringRef _name;
CFMutableSetRef _sources0;
CFMutableSetRef _sources1;
CFMutableArrayRef _observers;
CFMutableArrayRef _timers;
}

Runloop中有mode数组,每个modes中有sources0、sources1、observers、timers需要处理
六:runloop的observers监听状态(面试题:runLoop的几种状态)
Runloop的监听状态.jpeg
七:runloop的运行模式modes
CFRunLoopModeRef代表RunLoop的运行模式,一个RunLoop包含若干个mode,每个mode中都含有若干个source0、source1、Observer、timer,RunLoop启动时只能选择一个mode作为currentMode,如果需要切换mode,那么只退出当前Loop,再重新选择一个mode进入,这样做的话是同一时间内只能处理一个mode下的sources、Observer、timer,将不同的mode下的sources、Observer、timer区分开来,互不影响,如果没有任何的sources、Observer、timer,那么RunLoop会立马退出
八:RunLoop的运行逻辑(面试题:RunLoop的内部实现逻辑、RunLoop是怎样相应用户操作的,具体流程是怎样的)
1.Source0:触摸时间处理、performSelctor:onThread:
2.Source1: 基于Port的线程间的通信、系统时间的捕捉
3.Times:NSTimer、performSelector:WithObject:afterDelay:
4.Observers:用于监听RunLoop的状态、UI刷新、Autorelease pool

九:RunLoop在实际发开中的应用
1.控制线程声明周期(线程保活),可查看核心代码
在线程中开启RunLoop,想要执行的任务也必须在子线程中执行
self.thread = [[MYThread alloc] initWithBlock:^{
NSLog(@"----start----");
[[NSRunLoop currentRunLoop] addPort:[[NSPort alloc] init] forMode:NSDefaultRunLoopMode];
while (weakSelf && !weakSelf.stopped) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
NSLog(@"----end----");
}];
[self.thread start];
2.解决NSTimer在滑动时停止工作的问题,放到commonMode下
3.监控应用卡顿
4.性能优化
网友评论