【vsftp源码分析】【画流程图源码】【源码是几进制的】core foundation 源码

2024-12-23 00:24:49 来源:app商城wap源码 分类:热点

1.OC内存管理-runloop

core foundation 源码

源码vsftp源码分析

OC内存管理-runloop

源码vsftp源码分析        RunLoop 是通过内部维护的 事件循环( Event Loop )来对 事件/消息进行管理的一个对象。

源码vsftp源码分析

        runloop 的官方文档在 thread 篇章 Run Loops ,也就从侧面说明了 runloop 是与线程息息相关的。

源码vsftp源码分析

        官方有如下一张图:

源码vsftp源码分析

        线程的输入源:

源码vsftp源码分析

        线程针对输入源的处理机制:

源码vsftp源码分析

        有以下案例:

源码vsftp源码分析

        timer 与 performSelector 对应的回调都是 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ :

源码vsftp源码分析

        block 对应 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ :

源码vsftp源码分析

        主线程对应 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ :

源码vsftp源码分析

        系统触摸事件对应 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ :

源码vsftp源码分析

        通知事件对应 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ :

源码vsftp源码分析

        小结:

源码vsftp源码分析

        滚动页面输出:

源码vsftp源码分析

        页面滚动过程中处于 UITrackingRunLoopMode ,静止状态处于 kCFRunLoopDefaultMode 。

源码vsftp源码分析

        输出:

源码vsftp源码分析

        输出:

源码vsftp源码分析

        既然 runloop 是一个事件循环,那么它与普通的循环有什么区别呢?

源码vsftp源码分析

        普通循环:

源码vsftp源码分析

        runloop 循环:

源码vsftp源码分析

        那么可以得到以下结论:

源码vsftp源码分析

        那么 runloop 是怎么做到的呢?

源码vsftp源码分析

        通常我们会通过 NSRunLoop 去获取当前的 runloop :

源码vsftp源码分析

        定义如下:

源码vsftp源码分析

        给 currentRunLoop 下符号断点:

源码vsftp源码分析

        通过之前的分析已经定位到了 runloop 是在 CoreFoundation 中的 CoreFoundation源码 。正好 CoreFoundation 开源了 CFRunLoop :

源码vsftp源码分析

        那么核心逻辑就在 CFRunLoopRunSpecific 中。还有一个疑问是 runloop 可以休眠,那么它是如何实现的呢?

源码vsftp源码分析

        要了解 runloop 的实现原理,首先要清楚它的数据结构。

源码vsftp源码分析

        CFRunLoopRunSpecific 的第一个参数是 CFRunLoopGetCurrent() :

源码vsftp源码分析

        _CFRunLoopGet0

源码vsftp源码分析

        CFRunLoopRef 的定义如下:

源码vsftp源码分析

        实际上底层它是 __CFRunLoop 类型:

源码vsftp源码分析

        对于 timer 而言:

源码vsftp源码分析

        显然它是要依赖 mode 的。

源码vsftp源码分析

        CFRunLoopMode

源码vsftp源码分析

        而一个 mode 下又对应多个 items(source0、source1、timers、observers) ,所以就有如下关系:

源码vsftp源码分析

        既然有多种 mode ,那么都有哪些呢?

源码vsftp源码分析

        源码中有如下定义:

源码vsftp源码分析

        它们对应 Foundation 中的:

源码vsftp源码分析

        我们都清楚在页面滚动的时候有一个 UITrackingRunLoopMode :

源码vsftp源码分析

        除了以上 3 种 mode 还有两个私有 mode :

源码vsftp源码分析

        当 RunLoop 运行在 Mode1 上时,是无法接受处理 Mode2 或 Mode3 上的 Source、Timer、Observer 事件的。

源码vsftp源码分析

        以 timer 为例,将 timer 加入到 runloop 中:

源码vsftp源码分析

        底层调用了 CFRunLoopAddTimer :

源码vsftp源码分析

        根据要加入的 mode 区分是 common mode 和非 common mode 将 timer 加入 mode 中。这个时候只是将 timer 加入了 mode 中,要执行肯定要调用 CFRunLoopRun ,最终要调用 CFRunLoopRunSpecific 。

源码vsftp源码分析

        在 __CFRunLoopRun 中调用了 __CFRunLoopDoTimers :

源码vsftp源码分析

        找到 mode 中的所有 timer 然后调用 __CFRunLoopDoTimer 。

源码vsftp源码分析

        CFRunLoopAddTimer -> CFRunLoopRunSpecific -> __CFRunLoopRun -> __CFRunLoopDoTimers -> __CFRunLoopDoTimer -> __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ 。

源码vsftp源码分析

        与 timer 相同 source 会调用 CFRunLoopAddSource :

源码vsftp源码分析

        CFRunLoopAddSource -> CFRunLoopRunSpecific -> __CFRunLoopRun -> __CFRunLoopDoSources0/__CFRunLoopDoSources1 -> __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ /__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__

源码vsftp源码分析

        同理 observer 会调用 CFRunLoopAddObserver 。

源码vsftp源码分析

源码vsftp源码分析

更多资讯请点击:热点

推荐资讯

美PPI數據激勵! 美股四大指數全面上揚

關心美股表現,美國公布7月生產者物價指數PPI)增加幅度低於預期,顯示通膨壓力減緩,創造降息的條件,也激勵四大指數全面上揚。終場,道瓊工業指數上漲408點,收在3萬9765點;那斯達克指數上漲407點

部隊攻人加薩市核心區 以軍:勝利前不會停止

以巴衝突7號屆滿一個月,以色列軍方表示,部隊已經進人加薩市心臟地帶,目標就是要殲滅哈瑪斯,以軍強調,取得勝利之前,不會停止前進。誓言殲滅哈瑪斯組織 以國防長籲民眾速撤騅以巴衝突7號屆滿一個月,以色列總

陕西:信用指数稳中有进 经济活力向好向优

中国消费者报西安讯记者徐文智)10月9日,市场监管总局公布8月中国企业信用指数,企业信用水平保持总体稳定、稳中有进的发展态势。陕西信用指数排名全国第4位。近年来,陕西省市场监管局加快推进经营主体信用体