前面写了些关于runloop的基本内容,好多人说runloop,那么runloop有什么作用呢?
它的基本作用:
♦保持程序的持续运行 (runloop就是一个不断运行的死循环)
♦处理app中的各种事件(比如触摸事件、定时器事件、selector事件)
♦节省CPU资源,提高程序性能;(因为使用runloop时我们可以控制它在该做事时做事,该休息时休息)
我们知道在app启动后会在主线程自动开启一个runloop,如果没有runloop,那么我们的程序就会在启动后直接结束
下面我们来看看runloop的处理逻辑:
1、通知Observer:即将进入loop
2、通知Observer:将要处理Timer
3、通知Observer:将要处理Source0(注:事件源在这里笔者按函数调用栈来分的,分为Source0(用户主动触发的,非基于端口port的)、Source1(基于端口port的))
4、处理Source1(关于Source1我们可以这样理解:该事件是基于端口的事件,所以会进行内部的分发出timer事件与Source0事件)
5、如果有Source1就跳到第9步(在这里我们可以看到runloop的执行循环,只有把timer与事件源全部处理完才会进入休眠,否则会循环执行直到处理完为止)
6、通知Observer:线程即将休眠
7、休眠,等待唤醒
8、通知Observer:线程刚被唤醒
9、处理唤醒时收到的消息,之后跳回第2步
10、通知Observer:即将退出loop(当runloop的时间到了或者当所在线程挂掉都会退出)
看过这些我们对runloop的内部处理逻辑有了一些了解了,下面我们再来看看runloop的一个经典用法;
runloop的一个主要经典应用就是常驻线程,比如当我们使用子线程的时候,当线程里面的任务结束之后,这个线程就会挂掉,之后我们在调用这个线程的start方法就会失效,在这个时候我们使用runloop就可以创建一个常驻线程,防止线程死亡。
自动释放池问题
最后就是关于runloop的自动释放池问题,我们知道runloop会创建自动释放池,它的第一次创建是在启动runloop时,它最后一次销毁是在runloop推出的时候,但runloop并不止与一次创建于销毁,所以在线程即将休眠的时候也会销毁一次自动释放池并重新创建一个新的。
关于runloop的理论暂时先写这些,有了这些理解应该可以帮助读者更好的去理解runloop并运用它。