RunLoop与线程的关系,是非常“狗血”的。
没有RunLoop, 线程可能会"死"; 线程“死”了,RunLoop会停止运行。
开个玩笑,回到正题,它们之间的关系如下:
有兴趣了解RunLoop与线程哪些事么?让我们来一起揭秘!!
线程与RunLoop都是比较抽象的,幸好的是iOS给我们提供了2套API的访问框架:
想要了解RunLoop, 看源码是避免不了的....
一、线程与RunLoop是一一对应的
导入RunLoop相关源码, 这么阅读起来会方便些..
API接口是给我们直接创建RunLoop的接口,但是提供了获取RunLoop的接口
继续,跳转至源码查看,发现RunLoop没有获取到话,都会调用__CFRunLoopGet0, 并把线程作为参数传递.... (发现与线程扯上关系了...)
继续,跳转至__CFRunLoopGet0,源码代码被我简化了,如下:
到此,发现了线程与RunLoop的关系了么?
RunLoop与线程的关系是一对一的,并且用了个全局字典保存了起来!!
二、线程如果没有开启RunLoop, 任务执行完就会结束
线程里如果没有开启RunLoop
线程里如果开启了RunLoop
三、线程销毁了,RunLoop也会在线程结束时停止运行
线程没销毁,计时器正常的定时打印,RunLoop也是在正常运转
线程销毁了,计时器停止了,RunLoop也停止运行了
这是RunLoop系列的第二篇文章,下篇会继续探究RunLoop, 敬请期待...
本文分享自 HelloCode开发者学习平台 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!