了解
RunLoop从字面上理解就是运行循环。
iOS能够保证程序不死的原因就是加入了RunLoop,它在程序运行的过程中会不断的循环跑圈,一旦发现有事件需要处理,它就会通知当前线程去处理事件。没有需要处理的时间的时候RunLoop会进入到休眠的状态,直到有事件将它唤醒。所以说使用RunLoop一定程度上提高了程序的运行效率。
关于RunLoop我们还需要知道以下几点:
1、每一条线程都只能有一个与之对应的RunLoop对象
2、主线程在程序运行时已经自动创建好并启动RunLoop,子线程的RunLoop对象需要手动创建并启动。
3、RunLoop在第一次获取时创建,在线程结束时销毁。(也就是说对子线程来说第一次获取RunLoop时就会创建它,并且RunLoop的存在依赖于线程的存在)
RunLoop的运行模式
RunLoop在运行的时候会根据不同的需要选择相应的mode来运行,如当用户滑动界面的时候RunLoop会进入到UITrackingRunLoopMode
模式下来运行,但是需要注意的是,RunLoop启动时只能选择一种模式,如果想要切换模式只能退出当前RunLoop,再重新选择模式进入。
RunLoop模式:
目前已知的Mode有5种
kCFRunLoopDefaultMode
:App的默认Mode,通常主线程是在这个Mode下运行
UITrackingRunLoopMode
:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
UIInitializationRunLoopMode
:在刚启动 App 时进入的第一个 Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode
:接受系统事件的内部 Mode,通常用不到
kCFRunLoopCommonModes
:这是一个占位用的Mode,不是一种真正的Mode
那么我们怎么才能获取到RunLoop呢
[NSRunLoop currentRunLoop] //获取当前线程RunLoop对象
[NSRunLoop mainRunLoop] //获取主线程RunLoop对象
基本作用:
了解完RunLoop,那么RunLoop有什么作用呢?
1、保持程序的持续运行
2、处理App中的各种事件(比如触摸事件、定时器事件等)
3、节省CPU资源,提高程序性能:该做事时做事,该休息时休息
Runloop应用
那么在实际的开发中,我们在什么情况下会使用到RunLoop呢?
1、NSTimer 控制Timer在那种模式下运行
2、常驻线程 保证该线程不死
应用:检测网络状态、子线程中长期监控某些行为
3、控制某些行为在特定的模式下运行
如:控制图片在滑动时不显示
4、自动释放池
RunLoop在睡眠之前会释放自动释放池的内容,在唤醒时会创建自动释放池
网友评论