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

RunLoop基本介绍

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

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

代码层面

let runloop = RunLoop.current
let runloop1 = CFRunLoopGetCurrent()
let runloop2 = CFRunLoopGetMain()
print(runloop,runloop1)

<CFRunLoop 0x105a2a660 [0x7fff806f0b70]>{wakeup port = 0xd03, stopped = false, ignoreWakeUps = true xxxxx

Optional(<CFRunLoop 0x105a2a660 [0x7fff806f0b70]>{wakeup port = 0xd03, stopped = false, ignoreWakeUps = true xxxx

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

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

CF系列源码: Source Browser

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值