简单明了认识iOS中的RunLoop (持续更新,常学常新,精益
2019-06-21 本文已影响3人
非洲小白猿
为了常学常新,精益求精,我的所有文章都会持续更新
- 为了简单明了的认识RunLoop, 本篇文章不讲述RunLoop的使用, 只讲述RunLoop的认识, 关于RunLoop的使用, 请看我的这篇文章iOS中RunLoop的使用 为了更好的理解RunLoop, 可以结合来看
一、RunLoop是什么 ?
-
顾名思义, RunLoop就是运行循环, 它在程序运行过程中交替循环进行一些活动
-
RunLoop就像这幅图, 循环交替进行着这样的活动 : (来砖了)搬砖->(搬完了)睡觉->(来砖了)搬砖->(搬完了)睡觉......
![](https://img.haomeiwen.com/i3222009/3b42aedfe83e428a.png)
- RunLoop搬的砖是什么?
- App中的事件响应、手势识别、界面刷新
- 发送的网络请求, 线程间的通信
- AutoreleasePool释放对象
- 定时器的工作、PerformSelector
- GCD Async Main Queue
二、RunLoop有什么用 ?
- 维持程序的生命
-
RunLoop是iOS程序的生命, 没有RunLoop, iOS程序就没法一直活下去.
-
没有RunLoop的程序代码就像写在dispatch_once中的一段代码,一次性执行完就没有然后了, 表现在App中, 可能就是App启动完成后, 就会自动退出
-
我们写的iOS程序之所以都能够维持生命,是因为程序刚开始的时候,主线程为我们自动创建了RunLoop
-
子线程不会为我们自动创建RunLoop, 所以创建的子线程执行完任务就会销毁. 但有时候需要经常用到子线程, 为了优化性能, 就会在开启子线程的时候创建RunLoop, 让子线程一直活着, 有事做事, 没事休眠(AFN中就有这么做)
- 充分利用资源和节约资源
- RunLoop 使得程序能在有事做的时候做事(尽力做事,充分利用资源),没事做的时候就休息(尽量节约资源,不会浪费资源瞎折腾)
三、RunLoop的循环是怎样的 ?
程序的持续存活, 其实是系统在不断的调用RunLoop, RunLoop在休眠的时候也是需要资源维持的,
不过这种维持睡眠需要的资源很少,就好像我们人一样,白天搬砖需要的资源比晚上睡觉需要的资源多,
但并不是不需要资源.为了维持程序生命,这点消耗是必须的
RunLoop的循环可以用下图来表示, 我们iOS程序一启动, 主线程就为我们创建了RunLoop, 开始了这样的循环
![](https://img.haomeiwen.com/i3222009/1a0b78ca7c802f06.png)
Source0: 触摸事件处理, performSelector: onThread
Source1: 基于Port的线程间通信, 系统事件捕捉
Timers: NSTimer, performSelector: withObject: afterDelay:
Observers: 用于监听RunLoop的状态, UI刷新, Autorelease pool
RunLoop在iOS中的重要性是如此显而易见, iOS中的很多东西都跟它有着千丝万缕的关系, 关于这些, 可以通过我的iOS中RunLoop的使用这篇文章来了解