初识RunLoop运行循环 目的作用:1.保证启动的程序不退出;2.负责监听事件,触摸、时钟、网络事件;3.Runloop做完一件事,它就会sleep;4.Runloop负责在一次循环中渲染UI。...针对first一中的 我们把timer事件添加到了runloop的默认环境下,当应用程序启动当时候,我们没有做任何操作,timer事件来了,runloop就切换都默认模式下去执行timer事件,执行完毕后就马上睡觉...,timer事件又来,runloop又切换到默认模式下执行timer事件,执行完又睡觉,当这个时候你拖住了我们的界面,你就出发了UI模式下的source事件,runloop就马上处理source事件,你没有松手就一直处理...UI模式下的source事件,runloop 就无法再去处理默认模式下的timer 事件。...因为自线程的runloop默认不循环,怎么办,开启子线程的runloop循环。 [[NSRunLoopcurrentRunLoop]run];//让runloop循环起来,这是个死循环!!!!!
RunLoop 与线程的关系 苹果不允许直接创建 RunLoop,它只提供了两个自动获取的函数:CFRunLoopGetMain() 和 CFRunLoopGetCurrent()。...线程和 RunLoop 之间是一一对应的,其关系是保存在一个全局的 Dictionary 里。线程刚创建时并没有 RunLoop,如果你不主动获取,那它一直都不会有。...RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生在线程结束时。你只能在一个线程的内部获取其 RunLoop(主线程除外)。...RunLoop 对外的接口 一个 RunLoop 包含若干个 Mode,每次调用 RunLoop 的主函数时,只能指定其中一个 Mode,这个Mode被称作 CurrentMode。...RunLoop_1.png 总结下来就是:RunLoop 其内部是一个 do-while 循环。
RunLoop 是 iOS 和 OSX 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。...线程刚创建时并没有 RunLoop,如果你不主动获取,那它一直都不会有。RunLoop 的创建是发生在第一次获取时,RunLoop 的销毁是发生在线程结束时。...当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。...RunLoop 的内部逻辑 根据苹果在文档里的说明,RunLoop 内部的逻辑大致如下: ? 可以看到,实际上 RunLoop 就是这样一个函数,其内部是一个 do-while 循环。...RunLoop 的底层实现 从上面代码可以看到,RunLoop 的核心是基于 mach port 的,其进入休眠时调用的函数是 mach_msg()。
RunLoop,就是一个循环,但是当面试官问题RunLoop 休眠之后怎么被唤醒的?...RunLoop和线程的关系是怎么维护的?等等这一系列相关问答的时候你能否回答出来,如果不能那可以继续往下看,我们一起研究下神奇的RunLoop!...2.RunLoop内部结构(组成) 在CFRunLoop源码中有5个类跟RunLoop相关 CFRunLoopRef:代表 RunLoop 的对象 CFRunLoopModeRef:代表 RunLoop...所以,我们就有了 RunLoop。 一条线程对应一个RunLoop对象,每条线程都有唯一一个与之对应的 RunLoop 对象。...RunLoop 对象在第一次获取 RunLoop 时创建,销毁则是在线程结束的时候。 主线程的 RunLoop 对象系统自动帮助我们创建好了,而子线程的 RunLoop对象需要我们主动创建和维护。
没有实际应用场景,很难理解一些抽象空洞的东西,所以前面几篇文章先介绍了RunLoop的几个使用场景。 另外AsyncDisplayKit中也有大量使用RunLoop的示例。...关于实际的使用RunLoop 的案例和使用场景就不总结了,今天总结一点RunLoop的基础知识和概念。 什么是RunLoop? 顾名思义,它就是一个运行循环。...如何创建一个RunLoop? 包括MainRunLoop在内,每一个RunLoop都与一个线程关联着。确切的说,是先有线程,再有RunLoop。...关于线程与RunLoop的关系,在RunLoop官方文档的第一节讲的很清楚。 我们不用,也最好不要显示的创建RunLoop,苹果提供了两个API,便于我们来获取RunLoop。...关于RunLoop中的多种结构体以及RunLoop中的主要逻辑部分就先总结到这儿了。
RunLoop 文章目录 RunLoop简介 1.1 什么是RunLoop?...所以,我们就有了RunLoop。 一条线程对应一个RunLoop对象,每条线程都有唯一一个与之对应的RunLoop对象。...我们只能在当前线程中操作当前线程的RunLoop,而不能去操作其他线程的RunLoop。 RunLoop对象在第一次获取RunLoop时创建,销毁则是在线程结束的时候。...RunLoop相关类 下面我们来了解一下Core Foundation框架下关于RunLoop的5个类,只有弄懂这几个类的含义,我们才能深入了解RunLoop运行机制。...RunLoop运行逻辑图 这张图对于我们理解RunLoop来说太有帮助了,下边我们可以来说下官方文档给我们的RunLoop逻辑。
Core Foundation框架下关于RunLoop的5个类,只有弄懂这几个类的含义,我们才能深入了解RunLoop运行机制。...CFRunLoopRef:代表RunLoop的对象 CFRunLoopModeRef:RunLoop的运行模式 CFRunLoopSourceRef:就是RunLoop模型图中提到的输入源/事件源...CFRunLoopTimerRef:就是RunLoop模型图中提到的定时源 CFRunLoopObserverRef:观察者,能够监听RunLoop的状态改变 下边详细讲解下几种类的具体含义和关系...我们可通过以下方式来获取RunLoop对象: Core Foundation CFRunLoopGetCurrent(); // 获得当前线程的RunLoop对象 CFRunLoopGetMain()...可以看到RunLoop的状态在不断的改变,最终变成了状态 32,也就是即将进入睡眠状态,说明RunLoop之后就会进入睡眠状态。
[toc] RunLoop概念 ?...的关系 CFRunLoopGetMain(void) //获取主线程的runloop CFRunLoopGetCurrent(void) //获取当前线程的runloop CF_EXPORT CFRunLoopRef...睡眠 __CFRunLoopServiceMachPort(::::) 睡眠后有4种情况可以唤醒runloop: 基于port的source事件 timer事件 runloop超时 外部手动触发唤醒 事实上...每当RunLoop的内容发生变化时,RunLoop都会自动将commonModeItems里的Source/Observer/Timer 同步到具有 “Common” 标记的所有Mode里。...一般情况下被commone就是同时放入这两个mode的itemmode中 3,runloop是存在__CFRunLoops,而__CFRunLoops是一个全局的字典,和runloop本身无关。
1,Runloop是什么? 我们知道,Runloop可以保证线程不退出,那么,为什么Runloop具有此功效呢?那就要从Runloop的定义说起。...Runloop的字面意思是运行循环,但是我们不要忘了,Runloop其实也是一个对象,它位于CoreFoundation框架下。...Runloop可以监控上面的Runloop事件,具体流程如下图: ?...Runloop源码解析 Runloop实现 1,获取Runloop 从苹果开放的API来看,不允许我们直接创建Runloop对象,只能通过以下几个函数来获取Runloop: CFRunloopRef...不管获取子线程的runloop还是获取主线程的runloop,当存储线程与runloop对应关系的全局字典不存在时,都会创建并初始化该全局字典。
RunLoop 一 概述: 一句话解释RunLoop:运行任务的循环。 为什么要有RunLoop:解决交互式UI设计中的一个问题,如何快速响应用户输入,如何快速将程序运行结果输出到屏幕?...实现: 接下来的章节中我们将实际实现一个基本的runloop, 同样很阳春,具备这么些个功能: runloop 的启动、退出机制 任务注册 runloop重入,loop一段指定的时间 autorelease...//kick up runloop runloop_run(); return 0; } 瞧,这就是main函数的全部了,分两部分:注册任务和启动runloop。...一个runloop,一个线程。 当启动一个新的线程的时候, 这个线程并不会自动拥有一个 runloop,你必须自己完成创建等工作。 没有runloop,没有autorelease。...当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。
//从字典获取runloop CFRunLoopRef loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(...loop) { //创建新的runloop CFRunLoopRef newLoop = __CFRunLoopCreate(t); __CFLock(&loopsLock);...RunLoop保存在一个全局的字典里 线程为key RunLoop作为Value 线程刚创建的时候没有Ru nLoop对象,RunLoop会在第一次获取它的时候创建 主线程的RunLoop已经自动获取...(创建),子线程默认没有开启RunLoop 只有调用[NSRunLoop currentRunLoop] 才创建runLoop 由于key是线程 所以在线程结束的时候RunLoop也会随之销毁 二 Runtime...通过在打印调用栈 找到CFRunLoopRunSpecific 我们查看源码 看一下RunLoop的运行逻辑 /* rl, rlm are locked on entrance and exit */
RunLoop概念 RunLoop的数据结构 RunLoop的Mode RunLoop的实现机制 RunLoop与NSTimer RunLoop和线程 ---- 一、RunLoop概念 RunLoop...如果RunLoop被显示唤醒而且时间还没超时,重启RunLoop。进入步骤2 10、通知观察者RunLoop结束。...等维持RunLoop的事件循环(如果RunLoop的mode中一个item都没有,RunLoop会退出) 2、启动该RunLoop @autoreleasepool { NSRunLoop...原因是如果RunLoop的mode中一个item都没有,RunLoop会退出。...即在调用RunLoop的run方法后,由于其mode中没有添加任何item去维持RunLoop的时间循环,RunLoop随即还是会退出。
首先,Runloop是跟线程挂钩的,一个线程只能有唯一对应的Runloop,当然根Runloop 可以嵌套子Runloop,不过这种情况使用的并不多。...下面将会从Runloop的基本构造,Runloop的运行逻辑 以及 与Runloop相关的一些应用场景 三个方面介绍Runloop。 Runloop的基本构造 ?...RunLoop的运行逻辑 了解了Runloop 的基本构造后,我们来看下Runloop 内部的运行逻辑。...RunLoop相关的一些应用场景 在知道了Runloop的基本构造以及运行流程之后,我们来了解下与Runloop相关的一些场景: AutoreleasePool App启动后,苹果在主线程 RunLoop...这篇文章从Runloop的基本构造,Runloop的运行逻辑 以及 与Runloop相关的一些应用场景 三个方面入手,对Runloop的原理和机制进行了初步的探究,希望对大家了解Runloop运行机制方面有一定的帮助
RunLoop 与 NSTimer 由前面的文章我们知道,NSTimer是由RunLoop来管理的,NSTimer其实就是CFRunLoopTimerRef,他们之间是 toll-free bridged...解决 tableview 滑动时 NSTimer 失效的问题 问题:由前面的文章我们知道,RunLoop同一时间只能运行在一种模式下,当我们滑动tableview/scrollview的时候RunLoop...= rlt->_runLoop && rlt->_runLoop !...如果RunLoop的任务过于繁重,会导致它们不准时。 比如NSTimer每1.0秒就会执行一次任务,Runloop每进行一次循环,就会看一下NSTimer的时间是否达到1.0秒,是的话就执行任务。...但是由于Runloop每一次循环的任务不一样,所花费的时间就不固定。
其他篇关于Runloop: iOS之Runloop(1):基础 iOS之Runloop(2):事件源 iOS之Runloop(4):应用 Run loops 是线程相关的的基础框架的一部分。...模式 Run loop 模式是所有要监视的输入源和定时源以及要通知的 runloop注册观察者的集合。每次运行你的 runloop,你都要指定(无论显示还是隐式)其运行个模 式。...Run Loop Observer会与以下事件相关联: kCFRunLoopEntry – 进入runloop循环 kCFRunLoopBeforeTimers — runloop即将处理一个timer...kCFRunLoopBeforeSources – runloop即将处理input sources的事件 kCFRunLoopBeforeWaiting – runloop即将休眠 kCFRunLoopAfterWaiting...– runloop已经唤醒,但是唤醒runloop的是事件还没有处理。
获取runloop的函数 // 获取主线程的runloop CFRunLoopRef CFRunLoopGetMain(void) { CHECK_FOR_FORK(); static..., returnAfterSourceHandled, previousMode); // 判断是否要退出runloop,并通知观察者Observer,即将退出RunLoop if (...rlm: runloop mode seconds: 超时时间 stopAfterHandle: 完成后是否停止 runloop previousMode: 前一次的 mode...RunLoop 超时 // 4....退出 RunLoop return retVal; }
RunLoop 与线程的关系 苹果官方文档中,RunLoop的相关介绍写在线程编程指南中,可见RunLoop和线程的关系不一般。...Threading Programming Guide(苹果官方文档) RunLoop对象和线程是一一对应关系; RunLoop保存在一个全局的Dictionary里,线程作为key,RunLoop...作为value; 如果没有RunLoop,线程执行完任务就会退出;如果没有RunLoop,主线程执行完main()函数就会退出,程序就不能处于运行状态; RunLoop创建时机:线程刚创建时并没有RunLoop...对象,RunLoop会在第一次获取它时创建; RunLoop销毁时机:RunLoop会在线程结束时销毁; 主线程的RunLoop已经自动获取(创建),子线程默认没有开启RunLoop; 主线程的RunLoop.../Port等来维持RunLoop的事件循环(如果 Mode 里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出); ③ 启动该RunLoop。
所以,我们就有了RunLoop。 ●每条线程都有唯一一个与之对应的RunLoop对象。 ●我们只能在当前线程中操作当前线程的RunLoop,而不能去操作其他线程的RunLoop。...●RunLoop对象在第一次获取RunLoop时创建,销毁则是在线程结束的时候。 ●主线程的RunLoop对象系统自动帮助我们创建好了,而子线程的RunLoop对象需要我们主动创建。...3.RunLoop 相关类 下面我们来了解一下Core Foundation框架下关于RunLoop的5个类,只有弄懂这几个类的含义,我们才能深入了解RunLoop运行机制。...4.RunLoop原理 好了,五个类都讲解完了,我们就可以来理解RunLoop的运行逻辑了。 ?...进入步骤2 ○如果输入源启动,传递相应的消息 ○如果RunLoop被显示唤醒而且时间还没超时,重启RunLoop。进入步骤2 10.通知观察者RunLoop结束。
如果在面试中问到RunLoop相关的知识,很有可能也会问到RunLoop与GCD、Autorelease Pool有没有关系,哪些地方用到了GCD、Autorelease Pool等。...So,本文就总结一下RunLoop与GCD和 Autorelease Pool 之间的关系,看看在RunLoop实现中,哪些地方间接或者直接使用、操作到了GCD 和Autorelease Pool。...RunLoop 与GCD 的关系 在RunLoop 中大量使用到了GCD,首先来看一下 CFRrunLoop.c 中引入的其他头文件。...1.RunLoop 的超时时间 我们在前面介绍过RunLoop 启动在 CoreFoudation 库中有两个API: //mode默认为defaultMode、超时时间是100亿秒、false void...RunLoop 与 Autorelease Pool的关系 RunLoop与 Autorelease Pool 有关系么? 有。
领取专属 10元无门槛券
手把手带您无忧上云