皮皮网

【天天飞龙源码】【jetty 源码 pdf】【奷股源码】foundation源码

2024-11-19 02:34:04 来源:易语言ve源码

1.Visual Studio连接TFS(Team Foundation Server)
2.OpenHarmony系统解决方案 - 配置屏幕方向导致开机动画和Launcher显示异常
3.OC内存管理-runloop

foundation源码

Visual Studio连接TFS(Team Foundation Server)

       通过Visual Studio连接TFS(Team Foundation Server)的源码操作步骤可以简化为以下几步,提供更直观的源码答案:

       1. 首先,在Visual Studio的源码菜单栏中选择“工具”选项,然后在下拉菜单中找到并点击“选项”。源码在弹出的源码天天飞龙源码窗口中,从左侧的源码jetty 源码 pdf目录中选择“Visual Studio Team Foundation Server”,将它设置为当前使用的源码源代码管理插件。

       2. 紧接着,源码转到“团队”菜单,源码找到并点击“管理链接”。源码在新的源码窗口中,点击“团队资源管理器”下的源码“管理链接”选项,再选择“连接到团队项目”。源码奷股源码此时,源码需要输入TFS服务器的源码网址。

       3. 最后,在Visual Studio的云呼死你源码菜单栏中选择“文件”选项,点击“源代码管理”后,选择“将解决方案添加到源代码管理”操作。这一步将完成与TFS的连接,实现源代码的lineage源码镜像管理。

OpenHarmony系统解决方案 - 配置屏幕方向导致开机动画和Launcher显示异常

       系统版本:OpenHarmony-3.2-Release

       遇到的问题是配置屏幕方向导致开机动画和Launcher显示异常。

       问题现象出现在源码文件foundation/window/window_manager/resources/config/rk/display_manager_config.xml和系统文件/etc/window/resources/display_manager_config.xml中。

       异常效果是:正常效果下,系统运行平稳,无异常表现。

       问题的原因在于ScreenRotationController初始化时序的不当,使ScreenRotationController在Launcher加载Window时未触发。

       解决办法是调整ScreenRotationController的初始化时序,确保在Launcher加载Window时触发。通过修改源码文件foundation/window/window_manager/wmserver/src/window_node_container.cpp,对WindowNodeContainer::RemoveWindowNode和WindowNodeContainer::AddWindowNode函数进行代码修改。

       在定位问题的过程中,我们了解到若应用方向需要随系统切换,可在module.json5的ability中配置orientation为auto_rotation_restricted。

       为帮助大家更好地学习鸿蒙 (OpenHarmony) 开发技术,特别整理了《鸿蒙 (OpenHarmony)开发学习手册》(共计页),旨在提供深入学习资源。

       以下为手册的入门指南:

       《鸿蒙 (OpenHarmony)开发学习手册》入门必看:qr.cn/FV7h

       HarmonyOS 概念:qr.cn/FV7h

       如何快速入门?:qr.cn/FV7h

       开发基础知识:qr.cn/FV7h

       基于ArkTS 开发:qr.cn/FV7h

       手册覆盖了以下鸿蒙 (OpenHarmony) 开发领域:

       Ability开发

       UI开发

       公共事件与通知

       窗口管理

       媒体

       安全

       网络与链接

       电话服务

       数据管理

       后台任务(Background Task)管理

       设备管理

       设备使用信息统计

       DFX

       国际化开发

       折叠屏系列

       ……

OC内存管理-runloop

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

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

        官方有如下一张图:

        线程的输入源:

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

        有以下案例:

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

        block 对应 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ :

        主线程对应 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ :

        系统触摸事件对应 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ :

        通知事件对应 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ :

        小结:

        滚动页面输出:

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

        输出:

        输出:

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

        普通循环:

        runloop 循环:

        那么可以得到以下结论:

        那么 runloop 是怎么做到的呢?

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

        定义如下:

        给 currentRunLoop 下符号断点:

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

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

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

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

        _CFRunLoopGet0

        CFRunLoopRef 的定义如下:

        实际上底层它是 __CFRunLoop 类型:

        对于 timer 而言:

        显然它是要依赖 mode 的。

        CFRunLoopMode

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

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

        源码中有如下定义:

        它们对应 Foundation 中的:

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

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

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

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

        底层调用了 CFRunLoopAddTimer :

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

        在 __CFRunLoopRun 中调用了 __CFRunLoopDoTimers :

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

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

        与 timer 相同 source 会调用 CFRunLoopAddSource :

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

        同理 observer 会调用 CFRunLoopAddObserver 。