iOS面试题

初识runloop

2020-07-10  本文已影响0人  嗯o哼

一、什么是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的应用。

上一篇 下一篇

猜你喜欢

热点阅读