概念
运行循环
每个线程都有一个RunLoop对象,但是只有主线程的RunLoop是开启的。子线程中的RunLoop默认是不被创建的,在子线程中当我们调用NSRunLoop *runloop = [NSRunLoop currentRunLoop];
获取RunLoop
对象的时候,就会创建RunLoop
一个线程可以开启多个RunLoop,只不过都是嵌套在最大的RunLoop中
作用
使程序一直运行并接收用户的输入
决定程序在何时处理哪些事件
调用解耦(主调方产生很多事件,不用等到被调方处理完事件之后,才能执行其他操作)
节省CPU时间(当程序启动后,什么都没有执行的话,就不用让CPU来消耗资源来执行,直接进入睡眠状态)
NSRunLoopMode
每一个RunLoop都包含若干个CFRunLoopMode
在同一时间,只能在一种Mode下面执行
当需要切换Mode的时候,就必须退出当前的RunLoop。重新启动一个
- 系统默认的有以下5种模式
- kCFRunLoopDefaultMode: 默认 mode,也是空闲状态,通常主线程在这个 Mode 下运行。
- UITrackingRunLoopMode: 追踪mode,保证Scrollview滑动顺畅不受其他 mode 影响。
- UIInitializationRunLoopMode: 启动程序后的过渡mode,启动完成后就不再使用。
- GSEventReceiveRunLoopMode: Graphic相关事件的mode,通常用不到。
- kCFRunLoopCommonModes: 占位mode,包括了DefaultMode和CommonMode2种模式。
CFRunLoopMode又包含若干个CFRunLoopSource\ CFRunLoopTimer\ CFRunLoopObserver
- CFRunLoopMode的应用案例
做图片轮播器的时候,自动轮播一般是使用
NSTimer
来完成,如果使用的是kCFRunLoopDefaultMode
,那么当ScrollView
滚动的时候,RunLoop
模式就会切换为UITrackingRunLoopMode
,这时候NSTimer
就没法执行,这时候我们可以使用kCFRunLoopCommonModes
,就可以解决这个问题。
以上来源
其他
- runloop、autorelease pool以及线程之间的关系。
每个线程(包含主线程)都有一个Runloop。对于每一个Runloop,系统会隐式创建一个Autorelease pool,这样所有的release pool会构成一个像callstack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
网友评论