最近发现很多朋友都在找关于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