RunLoop本质

剖析RunLoop本质

说到runloop首先得清楚

  • runloop的概念
  • 数据结构
    使用runloop要达到的一个效果就是有事做的时候做事,没事做的时候休息,
  • 事件循环机制
    使用当中和面试经常会问起
  • runloop与NSTimer的的关系或者NSTimer在runloop中使用有什么地方需要注意
  • runloop与多线程的关系
  • 如何实现一个常驻线程

什么是RunLoop

runloop其实是一个对象,通过内部维护的事件循环来对事件\消息进行管理的一个对象

什么是事件循环

没有消息需要处理时,进入休眠,避免资源的占用,从用户态-内核态的状态切换
有消息需要处理时,立刻被唤醒,内核态-用户态的状态切换

我们的用户程序一般都运行在用户态上,当发生系统调用,需要一些操作系统、底层的指令,这就出发了内核态

事件循环实现机制

这里写图片描述

程序的入口

在我们的程序当中,默认的是从main函数入口,而main函数并没有退出?

在main函数中会调用uiapplicationmain函数,而这个函数内部会启动一个runloop,而runloop又是一个事件循环机制,有事做做事,没事做休眠,状态从用户态和内核态来回切换
这里写图片描述

Runoop数据结构

  • CFRunLoop

    这里写图片描述

  • CFRunLoopMode

    这里写图片描述
    sources0
    需要手动唤醒线程
    sources1
    具备自动唤醒线程的能力
    我们可以监测哪些时间点

    • KCFRunLoopEntry
    • KCFRunLoopEntryBeforeTimers
    • KCFRunLoopBeforeSources
    • KCFRunLoopBeforeWaiting
    • KCFRunLoopAfterWaiting
    • KCFRunLoopAfterExit
      RunLoop有多个mode的原因
      这里写图片描述
      通过CommonMode可以把Timer添加到多个mode中,它是一种技术解决方案
      CommonMode不是实际存在的一种Mode
  • Source/Timer/Observer

OC当中给我们提供了两个RunLoop
- NSRunLoop(Foundation)
- CFRunLoop(core Foundation)
NSRunLoop是对CFRunLoop的封装,提供了面向对象的api

Runoop与线程的关系

怎样实现一个常驻线程

为当前线程开一个RunLoop
向该RunLoop中添加一个port/Source等维持RunLoop的事件循环
启动该RunLoop

总结

这里写图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值