美文网首页
iOS底层学习27 -- runloop底层源码分析

iOS底层学习27 -- runloop底层源码分析

作者: 恋空K | 来源:发表于2020-11-27 11:40 被阅读0次
runloop切换模式会退出当前runloop,当前线程要销毁了,你的线程都要销毁了,runloop肯定也要干掉的,所以当前runloop也会退出。所以runloop切换模式,或者真的要完全退出的话,都是走到第11步,退出runloop。换种模式进来,或者下次在进runloop又会回到第1步



当没消息唤醒线程的时候,就会进入休息状态,代码就卡死在那里不执行了



GCD比较特殊,gcd只有一种情况是会交给runloop去处理的,gcd其实有自己的处理逻辑,gcd很多东西是不依赖runloop的。gcd的执行流程是gcd,runloop是runloop,runloop跟gcd是分开的
gcd这种情况是交给runloop去处理的(回到主线程刷新UI界面的code,前面子线程要干的事情,没有runloop也是可以做的,gcd跟runloop是两个不相关的东西) gcd回到主线程去干事情的话,就会依赖runloop
runloop休眠,可以看作是线程阻塞,不会继续往下走(就是卡在休眠的那一行代码)。一旦休眠,
代表当前线程就不再做事情了,cpu就不给当前线程分配资源了,
runloop是怎么响应用户操作的:首先是由source1来把系统事件捕捉,相当于你一点击屏幕的话,
这个事件是在source1里面去处理的,相当于它是个source1事件。source1又会把这个事件包装成事件队列
事件队列又是在source0里面处理的,所以是先由source1捕捉,放到source0里面去处理的
下面注释掉的方法是会自动开启定时器的,在默认mode下运行。上面那个方法仅仅只是返回一个定时器,不会默认开启定时器,需要把timer加到runloop里面去,才会开启定时器(CFMutableSetRef _commonModes(通用的模式)里面默认放的就是NSDdefaultRunLoopMode和UITrackingRunLoopMode这两种模式) CFMutableSetRef _modes所有能用的模式
_commonModes模式下运行工作的东西会放到CFMutableSetRef _commonModeItems里面去,比如上图的
timer。timer本来存在对应的mode下面的(因为每个模式都有自己timer),但是一旦运行到NSRunLoopCommonModes下面,就会放到
CFMutableSetRef _commonModeItems里面去。source0 ,source1也一样。

相关文章

网友评论

      本文标题:iOS底层学习27 -- runloop底层源码分析

      本文链接:https://www.haomeiwen.com/subject/wyyaiktx.html