一、作用:
1.保证程序持续运行
处理APP中的各种事件(如触摸事件、定时器事件、Selector事件)
节约cup资源,提高程序性能。该做事做事,该休息休息
每个线程都有一个唯一与之对应的runloop 对象
二、获取runloop
[NSRunLoopcurrentRunLoop];都会获取也当前线程管理的runloop ,默认情况下,子线程是没有开启runloop的。
2.runloop 需要手动开启 ,可以调用 run 方法。
3.不同的runloop运行对应不同的mode 模式
kCFRunLoopDefaultMode 默认主线程在这个mode下执行
UITrackingRunLoopModel 界面跟踪model,用于scrollView 跟踪触摸滑动,保证界面滑动不受其他model影响。
UIInitializationRunLoopMode:在刚启动App时第进入的第一个Mode,启动完成后就不再使用
GSEventReceiveRunLoopMode:接受系统事件的内部Mode,通常用不到
kCFRunLoopCommonModes 是通用模式,是一个占位标记(kCFRunLoopDefaultMode和UITrackingRunLoopModel)本身不是真正的model.
4.程序启动后,默认开启一个主运行循环,进行处理事件,保证程序持续运行,不退出。
三、souce分类
按调用栈分为:
1>source0 非基于port
2>source1基于port,通过内核和其他线程通信,接收、分发系统事件。
四、什么是runloop
1.字面就是运行循环,本质就do-while,循环处理各种事件(如timer、控件的点击、拖拽、port)
2.每个线程都有一个唯一与之对应的runloop,主线程由系统自己创建,不断循环处理各种事件,子线程的runloop需要获取,并且启动,调用对应的run方法。
3.runloop对应的mode如果没有timer、、source0或者source1时, 就会立即退出。(如果单有观察者也会退出)
4.gcd的dispatch_after 延迟执行不受 mode影响。
子线程的runloop默认不启动
runloop的使用场景:
1.开启一个常驻线程(让一个字线程不进入消亡状态,等待其他线程发来消息,处理其他事件)
子线程中开启一个定时器
子线程中进行一个长期监控
2.使timer 运行在不同的mode模式下
3.设置特定的mode,处理不同的任务、行为
autoreleaspool什么时候销毁?
通过observer监听runloop的状态,当进入休眠的时候,销毁当前的autoreleaspool
五、runloop 处理逻辑
网友评论