美文网首页
关于runloop详解

关于runloop详解

作者: best_su | 来源:发表于2017-02-08 21:31 被阅读0次

最近发现很多朋友都在找关于runloop的资料,今天有幸总结了一下,希望可以在面试的过程中帮着到你。

runloop:

1、简介:

RunLoop是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行;而且在没有事件处理的时候,会进入睡眠模式,从而节省CPU资源,提高程序性能。

2、说明:

Runloop是程序一直存在并不断处理事件的原因
main函数中的Runloop:
a. 在UIApplication函数内部就启动了一个Runloop 该函数返回一个int类型的值:
b. 默认启动的Runloop是跟主线程相关联的

3、Runloop对象:

在iOS开发中有两套api来访问Runloop
a. foundation框架【NSRunloop】
b. core foundation框架【CFRunloopRef】
c. NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换
d. NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)

4、苹果不允许直接创建 RunLoop,它只提供了两个自动获取的函数:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。

1.获得当前Runloop对象
NSRunLoop * runloop1 = [NSRunLoop currentRunLoop];
CFRunLoopRef runloop2 =   CFRunLoopGetCurrent();
2.拿到当前应用程序的主Runloop(主线程对应的Runloop)
NSRunLoop * runloop1 = [NSRunLoop mainRunLoop];
CFRunLoopRef runloop2 =   CFRunLoopGetMain();

5、程序主线程一开始,就会一直跑,那么其内部一定是开启了一个和主线程对应的RunLoop,并且可以看出函数返回的是一个int返回值的 UIApplicationMain()函数

6、CFRunloopRef与线程之间的关系:

1、线程在处理完自己的任务后一般会退出,为了实现线程不退出能够随时处理任务的机制被称为EventLoop,windows程序的消息循环,iOS、OSX的RunLoop都是这种机制。
2、线程和RunLoop是一一对应的,关系保存在全局的字典里。
3、在主线程中,程序启动时,系统默认添加了有kCFRunLoopDefaultMode 和 UITrackingRunLoopMode两个预置Mode的RunLoop,保证程序处于等待状态,如果接收到来自触摸事件等,就会执行任务,否则处于休眠中。
4、线程创建时并没有RunLoop,(主线程除外),RunLoop不能创建,只能主动获取才会有。RunLoop的创建是在第一次获取时,RunLoop的销毁是发生在线程结束时。只能在一个线程中获取自己和主线程的RunLoop。

7、Core Foundation中关于RunLoop的5个类

CFRunLoopRef //获得当前RunLoop和主RunLoop
CFRunLoopModeRef //运行模式,只能选择一种,在不同模式中做不同的操作
CFRunLoopSourceRef //事件源,输入源
CFRunLoopTimerRef //定时器时间
CFRunLoopObserverRef //观察者

8、Core Foundation中关于RunLoop的5个类之间的相互关系

1、runloop启动之后会选择一种运行模式,在执行执行会先检查运行模式内部是否有source和timers,如果一个sourc或者是一个timer都没有那么runlooop启动之后就立刻退出了。

2、runlooop的source有两种分类方法

按照以前的分类方法可以分为: 基于端口的  自定义的  performSelector事件
按照函数调用栈来划分:  source0  soucrce1
3、observer,可以用来监听当前runloop运行状态的改变,注意(Core foundation框架)

4、NSTimer必须添加到runloop中才会工作,且其工作收到runloop运行模式的影响。defultMode   UItrackingMode

9、什么时候使用run loop

1、仅当在为你的程序创建辅助线程的时候,你才需要显式运行一个run loop。
2、对于辅助线程,你需要判断一个run loop是否是必须的。如果是必须的,那么你要自己配置并启动它。你不需要在任何情况下都去启动一个线程的run loop

相关文章

  • 记录一些介绍Runloop的牛文

    老司机出品——源码解析之RunLoop详解深入理解RunLoop关于RunLoop部分源码的注释CFRunLoop...

  • RunLoop 详解

    关于 runloop 的运行 点击链接详解附有源码

  • iOS Runtime

    iOS RunLoop详解---重要而详细iOS RunLoop详解-部分

  • RunLoop详解

    RunLoop详解 RunLoop运行循环(死循环) RunLoop模式 NSDefaultRunLoopMode...

  • 关于runloop详解

    最近发现很多朋友都在找关于runloop的资料,今天有幸总结了一下,希望可以在面试的过程中帮着到你。 runloo...

  • Runloop 详解

    Runloop 详解 参考链接: 深入理解RunLoop CFRunLoop 概念 runloop :是管理和处理...

  • Runloop

    Runloop 实现原理及应用iOS - RunLoop 底层源码详解及具体运用

  • 深入理解RunLoop

    深入理解runloopiOS RunLoop详解

  • 底层原理探究(二)RunLoop

    转自: 老司机出品——源码解析之RunLoop详解入门使用: RunLoop入门 看我就够了孙源的Runloop视...

  • iOS RunLoop 详解

    转自 iOS RunLoop 详解 image.png Runloop 是和线程紧密相关的基础组件,是很多多线程有...

网友评论

      本文标题:关于runloop详解

      本文链接:https://www.haomeiwen.com/subject/mmmbittx.html