Runloop 学习

2020-02-28  本文已影响0人  Tony17

前言

在提到OC的时候,我们不可避免的会提到 Runloop 和 Runtime。但是Runloop到底是怎么工作的,我之前一直没有研究过,今天开看一下。

Runloop简单介绍

RunLoop就是事件循环,在程序运行过程中循环做一些事情。

基本作用

应用范畴

RunLoop与线程的关系

自动释放池

自动释放池的底层数据结构主要是 __AtAutoreleasePool、AutoreleasePollPage。调用了 autorelease 的对象最终都是通过 AutoreleasePollPage 对象管理的。

AutoReleasePoolPage的结构如下:


AutoReleasePoolPage_struct.png

RunLoop 和 AutoreleasePool 的关系

主线程中的RunLoop注册了2个Observer

  1. 第一个 Observer 监听了 kCFRunLoopEntry 事件,会调用 objc_autoreleasePoolPush()
  2. 第二个 Observer 监听了2个事件
    1. 监听了 kCFRunLoopBeforeWaiting 事件,会调用 objc_autoreleasePoolPop()、objc_autoreleasePoolPush()
    2. 监听了 kCFRunLoopBeforeExit 事件,会调用 objc_autoreleasePoolPop()

获取RunLoop对象:

CoreFoundation中关于RunLoop有5个类:

RunLoopMode

RunLoopModeRunLoop的运行模式,RunLoop总是在各种Mode之间切换

RunLoop 执行流程

先上图,网上找的RunLoop执行流程:

runloop-introduce.png

运行逻辑:

信号源解释:

runloop.png

RunLoop状态

type explain
KCFRunLoopEntry 即将进入Loop
KCFRunLoopBeforeTimers 即将处理Timer
KCFRunLoopBeforeSources 即将处理Source
KCFRunLoopBeforeWaiting 即将进入休眠
KCFRunLoopAfterWaiting 刚从休眠中唤醒
KCFRunLoopExit 即将退出Loop
KCFRunLoopAllActivities 所有状态改变 - 监听时用来监听所有状态

线程休眠原理:

NSTimer “不准时” 问题

问题: NSTimer依赖于 NSRunLoop,如果 RunLoop的任务过于繁重,可能会导致 NSTimer 不准时
解决办法: 使用GCD定时器

gcd_timer.png

实际开发中的运用

最后

以上就是我学习的全部内容,势必会有遗漏或错误的地方,欢迎斧正~

上一篇 下一篇

猜你喜欢

热点阅读