一、什么是runloop
顾名思义,运行循环。
按照正常的逻辑,一段代码由上到下依次执行,执行完毕后,程序退出。
对于我们的app来说,我们希望它一直在运行,等待用户的交互,并作出响应。那么就需要重复的执行代码。
相当于一个do...while 循环
没错runloop就是做这件事的。在程序的主入口 main 函数中将我们的代码包裹再while 循环中。就保证了,程序的可持续性。
那么runloop都做了哪些事情,仅仅是单纯的一个循环吗,有什么优化呢?
二、runloop的基本作用
程序运行的过程中,当没有任何交互的时候,我们希望程序,处于休眠状态,不进行任何的处理,仅仅是停留在最后一次显示的界面中。当用户点击界面进行操作的时候,激活程序,执行任务,那么runloop可以大概有一下几个作用
1.保持程序的运行状态
2.处理app的各种事件
3.节省cpu的资源,提高程序的性能。该做事的时候,做事,该休息的时候休息
三、runloop的数据结构
oc中runloop有两套API
C语言的API CFRunLoopRef ,C语音的runloop 是开源的,下载地址 https://opensource.apple.com/tarballs/CF/
OC语言的API NSRunLoop,它是对C语言的一层封装,为OC对象
1.runloop的获取方法
C
CFRunLoopRef runloop = CFRunLoopGetCurrent();
OC
NSRunLoop *currentRunloop = [NSRunLoop currentRunLoop];
2.runloop相关的类
1.CFRunLoopRef 是C语言的__CFRunLoop结构体类型
2.CFRunLoopModeRef 是C语言的 __CFRunLoopMode结构体类型,内部包含 source/timer/observer等
3.CFRunLoopSourceRef 主要用于系统事件
4.CFRunLoopTimerRef 定时器相关
5.CFRunLoopObserverRef 通知相关
四、runloop与线程的关系
1.每条线程都有唯一一个runloop与之对应,保存在一个全局的字典中,以线程为key,runloop为value
2.runloop是在第一次获取的时候创建,子线程中的runloop默认是没有开启的,因为我们没有获取过它
3.主线程中的runloop 是已经创建好了,因为在UIApplicationMain入口函数中,获取的时候创建好了
4.runloop在线程结束的时候销毁
关于runloop更多的内容,还是需要从源码入手。了解更多的runloop知识,深刻理解,有助于开发中,关于runloop的应用。
网友评论