没有Runloop:
代码执行完毕后,直接执行return 0。程序执行结束。
有Runloop:
程序并不会马上退出,而是保持运行状态
基本作用:
保持程序的持续运行
处理App中的各种事件
节省CPU资源,提高程序性能
int retVal = 0;.png当有事件来的时候就处理,完成后就为0,继续睡眠。
RunLoop与线程
一条线程对应一个RunLoop对象
保存方式是 保存在全局的字典当中,以线程为Key,对象为value
生命周期:生->线程创建时,RunLoop第一次被获取的时候创建对象
死->当线程结束时被销毁
主线程一开始就有RunLoop , 子线程默认没有被开启。
模式:
一个RunLoop对象有若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer
RunLoop启动时只能选择其中一个Mode,作为currentMode
如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入
不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响
如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出
常见的2种Mode
kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
(默认模式)
UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
(滑动模式)
执行流程图
执行逻辑:所谓的执行逻辑就是
你不做事,这个App开着其实是在休眠的,CPU没有运行。
但是你一做事情,或收到消息,RunLoop就会接受到事件,去处理一些事情。
处理完以后,再次进入到休眠中,一直循环。
休眠的细节
使用底层代码使CPU停止,而不是使用While循环,这样保证CPU不处理程序的任务,完全的休眠。
等有消息的时候在唤醒线程
Runloop 是怎么响应用户操作的, 具体流程是什么样的?
Source1 捕捉事件
Source0 处理事件
程序中添加每3秒响应一次的NSTimer,当拖动Tableview时timer可能无法响应要怎么解决?
将NSTimer加入到RunLoop对象中去,设置common模式。
Timer与RunLoop的关系。RunLoop里面有Mode,而mode里面有Timer.
当Timer设置common模式时,
结构
// 模式
//1. Name 模式名字
//2. 处理者
//3. 捕捉者
//4. 如果添加了观察者,在这里存放
//5. 存放这个模式能够使用的计时器
//RunLoop 对象
// 1.所在线程
// 2.通用模式,如果有计时器被设置了通用模式,那么这个里面就装着有的对象可以同时多个模式被使用。
// 3.通用模式对象, 存放在这个集合中的对象能够被设置为通用模式
// 4.当前使用的模式
// 5.所有模式
网友评论