RunLoop系列面试题- 1.什么是RunLoop,Runloop和线程的关系

RunLoop系列面试题- 1.什么是RunLoop,Runloop和线程的关系,第1张

RunLoop基本介绍

RunLoop翻译过来就是运行循环,就是保证程序运行的,本质就是个循环,它的目的本质就是为了保活,保护线程的活跃,能处理事件,NSTimer定时器,等等不方便在顺序程序中完成的 *** 作,而它又不同于普通的循环,因为它会休眠,相较于普通循环,它不会不停的占用着cpu gpu资源不放

基本流程:因为它是线程保活用的,所以一个线程对应一个RunLoop,同时保存在一个字典里面,由线程当Key,当创建了线程需要使用就会创建RunLoop对象,线程结束,RunLoop被销毁,手动创建的子线程,不会自动开启RunLoop

代码层面
let runloop = RunLoop.current
let runloop1 = CFRunLoopGetCurrent()
let runloop2 = CFRunLoopGetMain()
print(runloop,runloop1)

{wakeup port = 0xd03, stopped = false, ignoreWakeUps = true xxxxx

Optional({wakeup port = 0xd03, stopped = false, ignoreWakeUps = true xxxx

RunLoop可以有两种获取方式,其实是同一个东西,只是语言不同,第一个是根据OC改的,是基于NSObject,第二个是基于C的,包装出来是可选项,看地址可以看到,除了调用不同,访问的是同一个RunLoop

从Swift角度来说无疑是CFRunLoop更适合,因为开源+返回的是可选项,更符合Swift的可选链编程

CF系列源码: Source Browser

所以可以说RunLoop和线程的关系是保证线程活性的一个特殊的循环,主线程是一定有的,子线程如果不使用默认是没有,那么在线程代码执行完毕后,这个线程就会关闭,并且在没有开启RunLoop的情况下定时器和延时 *** 作都是无法正常使用的

补充:如果RunLoop的集合里面是空的,激活了也没用,所以一般要做保活 *** 作,一定要加一个无意义的东西,比如port

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/993860.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存