RunLoop底层原理和使用
![](/theme/default/default/images/main/eye-open.png)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
摘要:
本文系统总结了iOS开发中RunLoop的关键知识点,旨在复习其基本概念,源码获取方法,底层实现,以及解析ScrollView滑动时NSTimer失效问题。
一、RunLoop的基本概念:
RunLoop是线程相关的事件处理循环,旨在让线程在需要时忙碌,在无需时休息。主线程的RunLoop由系统自动创建和启动,而子线程的RunLoop需手动创建。一个常见的面试题是询问主线程为何持续运行,其答案正是RunLoop的存在。
二、获取RunLoop的源码:
NSRunLoop是基于CFRunLoopRef的封装,后者是CoreFoundation框架的一部分,提供纯C的API。RunLoop相关代码位于CFRunLoop.h/c文件中,源码可从苹果官方网站下载。
三、RunLoop的底层实现:
底层实现涉及两个核心概念:事件源和模式。事件源分为输入源和定时器源,分别对应异步事件和同步事件。输入源可通过端口、自定义或performSelector:onThread触发,而定时器源例如NSTimer。模式则是包含输入源、定时器、观察者的集合,告诉RunLoop哪些事件需要执行。有五种模式类型,分别是Default,Connection,Modal,Event tracking和Common modes。
四、ScrollView滑动,NSTimer失效分析:
当UIScrollView滑动时,RunLoop会进入Event tracking模式,导致NSTimer所在的Default模式无法得到响应。解决办法是将NSTimer加入NSRunLoopCommonModes,从而在UIScrollView滑动时仍能激活NSTimer。
想要了解更多内容?
![](/theme/default/default/images/main/icon-link.png)
![](/theme/default/default/images/main/icon-jing.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)