1.什么是Runloop
runloop是用来处理事件的循环。NSRunloop是CFRunloop的封装,CFRunloop是一套C接口。
2.Runloop的作用
- 保持程序持续运行,程序一启动就会开一个主线程,主线程一开起来就会跑一个主线程对应的RunLoop,RunLoop保证主线程不会被销毁,也就保证了程序的持续运行
- 处理App中的各种事件(比如:触摸事件,定时器事件,Selector事件等)
- 节省CPU资源,提高程序性能,程序运行起来时,当什么操作都没有做的时候,RunLoop就告诉CPU,现在没有事情做,我要去休息,这时CPU就会将其资源释放出来去做其他的事情,当有事情做的时候RunLoop就会立马起来去做事情。
3.runloop的构成
- CFRunLoopRef //runloop对象
- CFRunLoopModeRef//运行模式
- CFRunLoopObserverRef
- CFRunLoopTimerRef
- CFRunLoopSourceRef
struct __CFRunLoop {
pthread_t _pthread;//线程
CFMutableSetRef _commonModes; // commonModes下的两个mode(kCFRunloopDefaultMode和UITrackingMode)
CFMutableSetRef _commonModeItems; // 在commonModes状态下运行的对象(例如Timer)
CFMutableSetRef _modes; // 运行的所有模式(CFRunloopModeRef类)
CFRunLoopModeRef _currentMode;//在当前loop下运行的mode
...
};
struct __CFRunLoopMode {
CFStringRef _name; // Mode Name, 例如 @"kCFRunLoopDefaultMode"
CFMutableSetRef _sources0; // Set
CFMutableSetRef _sources1; // Set
CFMutableArrayRef _observers; // Array
CFMutableArrayRef _timers; // Array
...
};
4.Runloop的消息处理流程
消息的流程是“接收消息->恢复活跃->处理消息->进入休眠“。
5.runloop与线程
线程和 RunLoop 之间是一一对应的,其关系是保存在一个全局的 Dictionary 里。线程刚创建时并没有 RunLoop,如果你不主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生在线程结束时。你只能在一个线程的内部获取其 RunLoop(主线程除外)。