RunLoop
runloop是用来处理事件的循环。NSRunloop是CFRunloop的封装,CFRunloop是一套C接口。
runloop处理消息的流程是“接收消息->恢复活跃->处理消息->进入休眠”。
在runloop中,有多个运行模式,但是只能选择一种模式运行,mode中至少有一个timer或者是source。
Mode:系统默认注册5个Mode
kCFRunLoopDefaultMode:App默认Mode,通常来说主线程在这个Mode下运行
UITrackingRunLoopMode:界面跟踪Mode,用于scrollView的跟踪,触摸滑动保证滑动时不受其他Mode影响
kCFRunLoopCommonModes:占位用的Mode,不是真正的Mode
NSRunLoopCommonModes:相当于kCFRunLoopDefaultMode+UITrackingRunLoopMode
UIInitializationRunLoopMode:刚启动App时会进入的第一个Mode,启动完成之后不再使用
GSEventReceiveRunLoopMode:接受系统时间的内部Mode
runloop作用
1.保持程序持续运行,程序一启动就会开一个主线程,主线程一开起来就会跑一个主线程对应的RunLoop,RunLoop保证主线程不会被销毁,也就保证了程序的持续运行
2.处理App中的各种事件(比如:触摸事件,定时器事件,Selector事件等)
3.节省CPU资源,提高程序性能,程序运行起来时,当什么操作都没有做的时候,RunLoop就告诉CPU,现在没有事情做,我要去休息,这时CPU就会将其资源释放出来去做其他的事情,当有事情做的时候RunLoop就会立马起来去做事情。
一、RunLoop和线程的关系
1.runLoop和线程是一一对应的,主线程的runloop已经创建,子线程的runloop必须手动创建。
2.runloop在第一次获取时创建,在线程结束时销毁。
二、RunLoop和自动释放池
1.自动释放池会在启动runloop的时候创建
2.自动释放池会在启动runloop退出的时候释放
3.当runloop即将进入休眠时会销毁之前的释放池,并重新创建一个新的
总的来说,runloop和自动释放池都是为线程服务的。runloop可以使线程进入休眠和保活,以此可以节省cpu资源,而自动释放池是为了资源的回收释放。