<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>akinIan’s Blog</title>
        <link>blog.akinaustin.space/</link>
        <description>这是一个由NotionNext生成的站点</description>
        <lastBuildDate>Thu, 02 Jul 2026 02:07:37 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en-US</language>
        <copyright>All rights reserved 2026, akinIan</copyright>
        <item>
            <title><![CDATA[WWDC26中的性能优化：Apple 到底优化了什么]]></title>
            <link>blog.akinaustin.space/article/37ae7ea2-ebf7-8014-a2bf-c0adfccc75fd</link>
            <guid>blog.akinaustin.space/article/37ae7ea2-ebf7-8014-a2bf-c0adfccc75fd</guid>
            <pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[WWDC26中的性能优化：Apple 到底优化了什么]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-37ae7ea2ebf78014a2bfc0adfccc75fd"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-table-of-contents notion-gray notion-block-1846a4fbaedf4c0d88bf9e71a332057b"><a href="#37ae7ea2ebf780e68341fd84e1098b02" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">一、这次 Apple 给出的几个性能结果</span></a><a href="#37ae7ea2ebf7806bb13fc27da6e0e360" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">二、App 启动最高快 30%：系统提前准备关键数据</span></a><a href="#37ae7ea2ebf78044aaedc2514ee80867" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">相机启动：App 启动优化最具体的样板</span></a><a href="#37ae7ea2ebf7801aba49d49864df03e6" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">三、首帧不是终点：还要看用户什么时候真正可用</span></a><a href="#37ae7ea2ebf7802fb3c0f944f630f4da" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">四、照片加载最高快 70%：让内容更快出现在用户面前</span></a><a href="#37ae7ea2ebf780fb9b4eff96893e5217" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">五、AirDrop 最高快 80%、iPad 外置盘最高快 5 倍：传输速度也是体验</span></a><a href="#37ae7ea2ebf780e1ba13fbeac4e51dfb" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">六、CPU scheduler：让旧设备也更 responsive</span></a><a href="#37ae7ea2ebf780d58eaffe28fc969d0a" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">七、网络切换：减少用户手动处理连接的次数</span></a><a href="#37ae7ea2ebf78091b5dfee143b42b4c5" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">八、交互流畅性：100ms、8.3ms、5ms</span></a><a href="#37ae7ea2ebf7807a9bf9c5cb7b80cc6c" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">九、SwiftUI：让数据流更懒、更少重复</span></a><a href="#37ae7ea2ebf780ca8130e45c565a1859" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">十、官网里其他性能相关专题：语言、图像、GPU、资源与系统服务</span></a><a href="#37ae7ea2ebf780ecb87add5a7b8cc7c0" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">Swift 和 Foundation：把性能控制权下放到代码层</span></a><a href="#37ae7ea2ebf7800bbe74f65c8f854caa" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">Core Image RAW：把重计算搬到更合适的硬件和管线里</span></a><a href="#37ae7ea2ebf7805aab89daf2880fcb69" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">Metal 和游戏：用更低渲染成本换更稳定帧率</span></a><a href="#37ae7ea2ebf7803d9a33fd44b472ac26" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">Core AI 和 Foundation Models：AI 功能也要看延迟、内存和首用成本</span></a><a href="#37ae7ea2ebf780bd996cf3324579560d" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">App Intents：系统入口越多，性能越要可扩展</span></a><a href="#37ae7ea2ebf780c586b1fb4f9f9bc0c6" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">十一、给 App 开发者的启发</span></a></div><div class="notion-blank notion-block-6bf43f1844c245adaa19cfbc8bdf946f"> </div><div class="notion-text notion-block-37ae7ea2ebf780cf86ede4c09d3eddcb">性能优化在发布会上通常不太抢镜，但它往往最影响日常体验。</div><div class="notion-text notion-block-37ae7ea2ebf78004ba79f4f1da843a20">WWDC26 里，Apple 把几个很常见的等待场景放在一起讲：点开 App、拍完照片、传文件、切换网络、滑动系统界面、在旧设备上跑更重的任务。它们看起来分散在系统不同角落，但对用户来说，感受其实很简单：是不是更快出现，是不是更少卡住，是不是更少需要自己处理。</div><div class="notion-text notion-block-37ae7ea2ebf780e08851c05ce91d187e">所以这次这些性能更新，不太像传统意义上的“跑分提升”，更像是在系统的很多路径上一起减少摩擦：系统动画、App 启动、照片加载、AirDrop、iPad 文件传输、CPU scheduler、Wi-Fi 和蜂窝网络切换。背后共同指向一件事：</div><div class="notion-callout notion-blue_background_co notion-block-129dd80200884f9e934fb49c7b0d5f8f"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="⚡">⚡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-2b2656241c2241e19e76c592b0ff9e0b"><b>减少用户感知到的等待。</b></div></div></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf780e68341fd84e1098b02" data-id="37ae7ea2ebf780e68341fd84e1098b02"><span><div id="37ae7ea2ebf780e68341fd84e1098b02" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780e68341fd84e1098b02" title="一、这次 Apple 给出的几个性能结果"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>一、这次 Apple 给出的几个性能结果</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf7801e911ad21e579bccef">在 <a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/101/?time=625" target="_blank" rel="noopener noreferrer">WWDC26 Keynote</a> 的 Platform improvements 段，Apple 先说今年花了很多时间优化 fundamentals，包括 memory usage、CPU utilization、networking operations、display rendering。随后给了几组非常具体的结果：</div><table class="notion-simple-table notion-block-13eedea59e0440278eeb13553cba040b"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-bf0b62e53ff4417fa197fa34c46d36c0"><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>场景</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>提升</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>补充说明</b></div></td></tr><tr class="notion-simple-table-row notion-block-119b21408df34f91b65cc018a971cab9"><td class="" style="width:120px"><div class="notion-simple-table-cell">App 启动（iPhone / iPad）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">最高快 <b>30%</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">第三方 App 同样适用；系统预加载关键数据</div></td></tr><tr class="notion-simple-table-row notion-block-4e95655e6a504f628b0182fdab042dbd"><td class="" style="width:120px"><div class="notion-simple-table-cell">新拍照片进入图库</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">最高快 <b>70%</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">缩短“产生内容 → 看到内容”的等待</div></td></tr><tr class="notion-simple-table-row notion-block-f9b80333606c46e2ae95a08e2015ec9e"><td class="" style="width:120px"><div class="notion-simple-table-cell">AirDrop 传输</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">最高快 <b>80%</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td></tr><tr class="notion-simple-table-row notion-block-c856c92cf6bf43c2b5de6fe4f20c0d56"><td class="" style="width:120px"><div class="notion-simple-table-cell">iPad 浏览文件 / 外置盘传输</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">最高快 <b>5 倍</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">体验接近 Mac Finder</div></td></tr><tr class="notion-simple-table-row notion-block-cf03c4ffeb1a440884159ab8aff48f93"><td class="" style="width:120px"><div class="notion-simple-table-cell">系统动画</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">更顺</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">主屏滑动、Mission Control、Spaces 切换</div></td></tr><tr class="notion-simple-table-row notion-block-547ddf40beb140f98471582c4c80c315"><td class="" style="width:120px"><div class="notion-simple-table-cell">CPU scheduler</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">进一步优化</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">覆盖到 iPhone 11 这类旧机型</div></td></tr><tr class="notion-simple-table-row notion-block-e77e238bbf35478999fb6629429970c0"><td class="" style="width:120px"><div class="notion-simple-table-cell">Wi-Fi ↔ 蜂窝切换</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">更无缝</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">减少用户手动开关 Wi-Fi</div></td></tr></tbody></table><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-37ae7ea2ebf780be8275f563a0784585"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aacf0342b-2039-4a75-8e67-d0031da69b60%3Aimage.png?table=block&amp;id=37ae7ea2-ebf7-80be-8275-f563a0784585&amp;t=37ae7ea2-ebf7-80be-8275-f563a0784585" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-37ae7ea2ebf7806e9098c4c8f2409d06">这些优化不是同一类技术，但它们有一个共同目标：让用户觉得系统一直在跟手、内容一直在路上、操作不用等。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf7806bb13fc27da6e0e360" data-id="37ae7ea2ebf7806bb13fc27da6e0e360"><span><div id="37ae7ea2ebf7806bb13fc27da6e0e360" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf7806bb13fc27da6e0e360" title="二、App 启动最高快 30%：系统提前准备关键数据"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>二、App 启动最高快 30%：系统提前准备关键数据</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf7804096d6c41c99b8d0f2">我最关注的还是 App 启动最高快 30%。原因很简单：Apple 明确说，这个提升也适用于第三方 App。</div><div class="notion-text notion-block-37ae7ea2ebf780acbfc0f24c34fd6760">但这里要先把边界说清楚。Apple 在 keynote 里公开解释这个 30% 时，只说了一个核心原因：系统会在 App 打开前预加载 App 需要的关键数据，让 App 在用户点开时更 ready to go。Apple 没有在 keynote 里展开底层实现，所以不能把它直接写成“靠 dyld”“靠 prewarm”或者“靠 launch closure”。这些是理解启动链路的背景，不是 Apple 对 30% 的逐项拆解。</div><div class="notion-text notion-block-37ae7ea2ebf780e5a2b0eee73a1f10e3">不过，把这句话放回 Apple 的启动文档里看，方向已经很清楚了：启动优化正在从“用户点图标之后再开始抢时间”，变成“系统尽量提前准备可预测的部分”。</div><div class="notion-text notion-block-37ae7ea2ebf780f68955cbc0b592c49f"><a class="notion-link" href="https://developer.apple.com/documentation/uikit/about-the-app-launch-sequence" target="_blank" rel="noopener noreferrer">UIKit 启动序列文档</a> 把 App launch 拆成一条流水线：<code class="notion-inline-code">main()</code>、<code class="notion-inline-code">UIApplicationMain</code>、<code class="notion-inline-code">willFinishLaunching</code>、state restoration、<code class="notion-inline-code">didFinishLaunching</code>、scene connection，最后才是 UI 出现在用户面前。文档还提到系统可能会 prewarm App：提前创建进程、加载链接库，但不运行 App 代码，然后把进程挂起，等真正需要时再继续标准启动序列。</div><div class="notion-text notion-block-37ae7ea2ebf78099b8b1e843bb7bf273">这说明一件事：Apple 能优化的是启动链路里系统可以掌控、可以预测、可以提前准备的那部分。但首屏之前 App 自己到底做了多少事，仍然是开发者自己的责任。</div><div class="notion-text notion-block-37ae7ea2ebf780d7b6dac969ecc39728">如果一个 App 启动时同步初始化十几个 SDK，立刻打开数据库，读一堆配置文件，做全量 migration，恢复复杂页面状态，拉远端开关，解码首屏大图，再顺手把埋点、Push、IM、支付、直播、广告都启动一遍，那么系统帮你省下来的时间，很可能会被业务初始化重新吃掉。</div><div class="notion-text notion-block-37ae7ea2ebf7805ba649fa784b8a4d78">Apple 的 <a class="notion-link" href="https://developer.apple.com/documentation/xcode/reducing-your-app-s-launch-time" target="_blank" rel="noopener noreferrer">Reducing your app&#x27;s launch time</a> 文档里有几个很直接的抓手。</div><div class="notion-text notion-block-37ae7ea2ebf78080a00bdf04b2b29b5c">第一，减少动态库和三方 framework。你的代码运行前，<code class="notion-inline-code">dyld</code> 需要找到并加载可执行文件和依赖库，解析动态符号。Apple 明确说，每额外加载一个三方 framework 都会增加启动时间。虽然系统会用 launch closure 缓存很多工作，但 launch closure 的大小，以及加载后剩余工作，仍然和库的数量、大小有关。</div><div class="notion-text notion-block-37ae7ea2ebf7804ca0c5c647b86c48a2">第二，审计 <code class="notion-inline-code">main()</code> 之前就运行的代码。C++ static constructors、Objective-C <code class="notion-inline-code">+load</code>、<code class="notion-inline-code">__attribute__((constructor))</code>、<code class="notion-inline-code">__DATA,__mod_init_func</code> 都可能在 App 进入 <code class="notion-inline-code">main()</code> 前执行。也就是说，有些启动耗时不是藏在 <code class="notion-inline-code">didFinishLaunching</code> 里，而是藏在你还没进 <code class="notion-inline-code">main()</code> 之前。</div><div class="notion-text notion-block-37ae7ea2ebf7805688abc1603c2eee56">第三，别把 AppDelegate 当杂物间。Apple 文档说得很直白：<code class="notion-inline-code">willFinishLaunching</code> 和 <code class="notion-inline-code">didFinishLaunching</code> 在主线程同步执行，launch cycle 要等它们返回。任何昂贵任务都会拖慢启动。真正需要放在启动期的，应该只有首屏必要配置、必要依赖和入口路由；非首屏 SDK、完整用户画像、缓存清理、日志上传、推荐刷新，都应该尽量延后。</div><div class="notion-text notion-block-37ae7ea2ebf780eabd01dc9605288fc0">第四，首屏只取必要数据。Apple 文档举了一个照片图库例子：默认启动时只需要展示一屏缩略图占位，再在启动后填充真实缩略图；不需要一开始就加载完整大图。换句话说，首屏不是“把所有数据都准备好”，而是“把用户眼前这一屏准备到足够可用”。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-37ae7ea2ebf78044aaedc2514ee80867" data-id="37ae7ea2ebf78044aaedc2514ee80867"><span><div id="37ae7ea2ebf78044aaedc2514ee80867" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf78044aaedc2514ee80867" title="相机启动：App 启动优化最具体的样板"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>相机启动：App 启动优化最具体的样板</b></span></span></h4><div class="notion-text notion-block-37ae7ea2ebf780e18517c52fef3867e3">这也是为什么我觉得相机启动应该放在 App 启动这部分一起看。<a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/303/" target="_blank" rel="noopener noreferrer">Build a responsive camera app that launches quickly</a> 这场 session，其实是 Apple 对“启动优化怎么做”的一次具体拆解。</div><div class="notion-text notion-block-37ae7ea2ebf780f7b1f9dbe10b7cd898">相机 App 的用户感知非常极端。用户不是在等一个 App 打开，用户是在等取景画面出现。Apple 在 session 里明确说，让 camera launch 感觉快，最关键的是 preview frame 多快出现在屏幕上。换句话说，<span class="notion-blue">相机的 first useful frame 就是第一帧 preview</span>。</div><div class="notion-text notion-block-37ae7ea2ebf7808aa941f1152e9e5671">Apple 把相机启动链路拆成几个阶段：App launch，配置 <code class="notion-inline-code">AVCaptureSession</code>，start session，初始化 capture outputs，最后 preview 开始 streaming，frames 流到 App。这里面最贵的部分之一，就是 capture outputs 的初始化。因为 session 一旦 start，所有 output 对象都要初始化，而初始化成本会随着 output 数量和质量设置增加。</div><div class="notion-text notion-block-37ae7ea2ebf7801d9c2cd29b262db16a">但对“第一帧 preview”来说，App 并不需要所有 output 都准备好。比如只是展示取景画面，通常只需要 <code class="notion-inline-code">AVCaptureVideoPreviewLayer</code> 或一个用于 preview 的 output。<code class="notion-inline-code">AVCapturePhotoOutput</code>、movie file output 这些和拍照、录像相关的 output，不一定需要在第一帧 preview 前完成初始化。</div><div class="notion-text notion-block-37ae7ea2ebf780aba148eb8d95829cf0">新的 deferred start API 就是围绕这个目标设计的：把不影响 launch 的 output initialization 延后到 preview started 之后。Apple 的建议很明确：defer all outputs except the output used to render preview。</div><div class="notion-text notion-block-37ae7ea2ebf78043b911d5c16bb663e4">实现上，开发者可以给不需要参与首帧 preview 的 output 设置 <code class="notion-inline-code">isDeferredStartEnabled = true</code>。自动模式下，<code class="notion-inline-code">AVCaptureSession.automaticallyRunsDeferredStart = true</code>，系统会在 preview 出现后选择合适时间运行 deferred start。App 还可以通过 <code class="notion-inline-code">AVCaptureSessionDeferredStartDelegate</code> 接收 <code class="notion-inline-code">sessionWillRunDeferredStart</code> 和 <code class="notion-inline-code">sessionDidRunDeferredStart</code>，知道延迟初始化什么时候开始、什么时候结束。</div><div class="notion-text notion-block-37ae7ea2ebf780e482a7f32fe3519543">如果 App 需要自己用 <code class="notion-inline-code">AVCaptureVideoDataOutput</code> 渲染 preview，比如要做逐帧处理、滤镜、分析或自定义渲染，就不能完全依赖 automatic mode。session 里给出的做法是：先 disable 对这个 preview output 的 deferred start，等第一帧真正 present 后，再调用 <code class="notion-inline-code">runDeferredStartWhenNeeded()</code>，让系统开始初始化那些被延后的 output。</div><div class="notion-text notion-block-37ae7ea2ebf780dc93d7ca18490c6287">这里还有一个很重要的选择：<code class="notion-inline-code">AVCaptureVideoPreviewLayer</code> 和 <code class="notion-inline-code">AVCaptureVideoDataOutput</code> 不是同一个成本模型。前者更适合只是展示 camera feed，Apple 说它针对低延迟 preview 做了优化，也能更自然地使用 automatic deferred start；后者给了 App per-frame access 和更多控制，但成本更高，也需要手动处理 deferred start 的时机。</div><div class="notion-text notion-block-37ae7ea2ebf78075ba25d47e4c45f5c3">这场 session 里 Apple 做了一个很直观的实验：不开 deferred start 时，示例相机启动接近 1 秒；开启 deferred start 后，launch cut in half。这个结果不是泛泛地说“少做点事会更快”，而是很具体地说明：把不影响第一帧的 output 初始化从启动路径里移出去，启动体验会立刻变化。</div><div class="notion-text notion-block-37ae7ea2ebf780358abfc7abd17597d0">不过 Apple 也没有把话说得过满。它提醒说，preview 更快，不代表 first capture 一定更快。因为 photo output 被延后后，用户虽然更早看到了 preview，但首拍能力可能还没完全 ready。所以 session 里还建议配合 responsive capture，让用户即使在 photo output 尚未完全 ready 时，也能更快捕捉瞬间。</div><div class="notion-text notion-block-37ae7ea2ebf780a3bcd7c08f45644e7e">这就是我觉得普通 App 最应该借鉴的地方：启动优化不是把所有东西都做快，而是判断什么东西必须出现在第一帧前，什么东西可以在第一帧后补。相机的 preview frame，其实就是所有 App 的 first useful frame。</div><div class="notion-text notion-block-37ae7ea2ebf780cd80d7f09237ae8c5e">信息流 App 的 first useful frame，可能是本地缓存的前几条内容。电商 App 可能是首页框架和一屏可点的商品。剪辑 App 可能是项目缩略图和时间线骨架。办公 App 可能是最近文档列表，而不是等全文索引和云同步都完成。</div><div class="notion-text notion-block-37ae7ea2ebf7802a89fde104acbee407">相机场次后半段还补了一个重要视角：启动快只是第一步，持续稳定才是体验。Preview running 之后，steady framerate and cadence 仍然关键。Apple 建议用 <code class="notion-inline-code">hardwareCost</code> 判断 capture session 配置是否超过设备能力，在 commit configuration 后确认成本在设备能力内；同时观察 <code class="notion-inline-code">systemPressureState</code>，在压力上升时降级配置。高码率视频写入则可以使用 AVProVideoStorage，让 ProRes 这类 high data-rate codec 的写入性能更稳定。</div><div class="notion-text notion-block-37ae7ea2ebf780a586bdd736d19f381e">这个部分和 App 启动 30% 放在一起看，逻辑会更完整：系统在尽量提前准备关键数据，而 App 自己也应该把“第一帧前必须完成的工作”压到最小，把非关键能力延后，把持续性能和恢复能力作为启动之后的第二阶段。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf7801aba49d49864df03e6" data-id="37ae7ea2ebf7801aba49d49864df03e6"><span><div id="37ae7ea2ebf7801aba49d49864df03e6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf7801aba49d49864df03e6" title="三、首帧不是终点：还要看用户什么时候真正可用"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>三、首帧不是终点：还要看用户什么时候真正可用</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf780ebbe9ee3452043dae7">Xcode Organizer 和 MetricKit 的启动口径是 time to first draw，也就是用户点击图标，到静态 launch screen 之后第一帧绘制出来。但 Apple 文档也提醒，如果第一帧出来后 App 还在渲染文档、展示 loading、替换占位界面，用户仍然会把这段等待感知为启动时间。</div><div class="notion-text notion-block-37ae7ea2ebf7809886efca15db0261f8">所以 App 团队不应该只量 tap to first draw，还应该量 first draw to first useful。前者是系统和工具能统一统计的指标，后者才更接近用户体感。Apple 文档建议可以用 <code class="notion-inline-code">os_signpost</code> 和 Points of Interest 记录这些额外启动活动，把“首屏可见”和“首屏可用”拆开看。</div><div class="notion-text notion-block-37ae7ea2ebf780bc8188d8dbba9aebed"><a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/222/" target="_blank" rel="noopener noreferrer">WWDC26 的 MetricKit session</a> 也和这个方向一致。iOS 27 里 MetricKit 有新的 Swift-first <code class="notion-inline-code">MetricManager</code> API，可以通过 <code class="notion-inline-code">AsyncStream</code> 接收 <code class="notion-inline-code">MetricReport</code> 和 <code class="notion-inline-code">DiagnosticReport</code>。iOS 27 release notes 还提到，MetricKit 可以结合 StateReporting，让 metrics 和 diagnostics 带上开发者定义的业务状态。</div><div class="notion-text notion-block-37ae7ea2ebf780ea9dd3fd1ee4f6c541">这对启动优化很有用。不要只问“iOS 27 有没有让我的 App 快 30%”，而是要看真实用户的 p50、p90，按系统版本、设备型号、入口场景、业务状态拆开。比如默认首页、Push 入口、Deep Link 入口、恢复上次复杂页面，启动路径完全不同，混在一起看平均值没有太大意义。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf7802fb3c0f944f630f4da" data-id="37ae7ea2ebf7802fb3c0f944f630f4da"><span><div id="37ae7ea2ebf7802fb3c0f944f630f4da" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf7802fb3c0f944f630f4da" title="四、照片加载最高快 70%：让内容更快出现在用户面前"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>四、照片加载最高快 70%：让内容更快出现在用户面前</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf780e7b9c6f3d0a46aca4b">Keynote 里另一个数字是，新拍照片进入图库最高快 70%。Apple 在这里举的场景很具体：过去拍完照片后，照片进入图库可能要等一下；现在新照片出现得更快。</div><div class="notion-text notion-block-37ae7ea2ebf7806da19af943f3544489">这部分 Apple 没有在 keynote 里展开底层实现，所以不能擅自写成某个具体算法。但可以确定的是，Apple 优化的是一条非常典型的内容可见路径：用户刚刚产生了内容，系统要尽快让内容出现在下一处用户会查看的地方。</div><div class="notion-text notion-block-37ae7ea2ebf780089fa7c353adc1976a">这对 App 开发者也很有启发。很多 App 的“慢”不是启动慢，而是内容到达界面慢：拍完、发完、保存完、导入完、同步完，用户下一秒就会去另一个页面找结果。如果这个结果没有及时出现，用户会怀疑刚才的操作是不是失败了。</div><div class="notion-text notion-block-37ae7ea2ebf7803eb044d852eebaecac">对应到 App 设计里，应该尽量让关键内容先可见，再慢慢补齐非关键细节。例如先展示本地结果，再后台同步；先展示缩略图，再加载原图；先展示最新一条记录，再补全排序、索引、推荐和云端状态。用户不一定要求所有东西都瞬间完整，但会非常在意自己刚刚产生的东西有没有被系统接住。</div><div class="notion-text notion-block-37ae7ea2ebf780d594b6f2cbc6b19262">SwiftUI 这次也有相关的小优化。<a class="notion-link" href="https://developer.apple.com/wwdc26/guides/swiftui/" target="_blank" rel="noopener noreferrer">WWDC26 SwiftUI guide</a> 提到，<code class="notion-inline-code">AsyncImage</code> 默认支持标准 HTTP caching，会尊重 server cache headers；需要更多控制时，可以传自定义 <code class="notion-inline-code">URLRequest</code>，或者配置带自定义 <code class="notion-inline-code">URLCache</code> 的 <code class="notion-inline-code">URLSession</code>。这类改动不是很炫，但很实用：少重复加载，少重复等待，让内容更自然地复用缓存。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf780fb9b4eff96893e5217" data-id="37ae7ea2ebf780fb9b4eff96893e5217"><span><div id="37ae7ea2ebf780fb9b4eff96893e5217" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780fb9b4eff96893e5217" title="五、AirDrop 最高快 80%、iPad 外置盘最高快 5 倍：传输速度也是体验"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>五、AirDrop 最高快 80%、iPad 外置盘最高快 5 倍：传输速度也是体验</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf7801397f4f53b7fb198cf">Apple 还提到，AirDrop 传输最高快 80%；iPad 浏览文件、把文件传到外置盘最高快 5 倍，并接近 Mac Finder 的体验。</div><div class="notion-text notion-block-37ae7ea2ebf780df9f8bd24a2c219e5c">这两个点很容易被当成系统功能更新，但它们其实也是性能优化。因为文件传输是最典型的“用户无法假装没在等”的场景：文件没传完，用户就不能继续下一步。</div><div class="notion-text notion-block-37ae7ea2ebf7806db13ceb0fd3117829">Apple 没在 keynote 里公开 AirDrop 和 Files 的底层实现细节，所以这里不能乱猜。但对 App 开发者来说，可以借到同一套工程原则：</div><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf78003873adbb0bdcca836"><li>大文件导入导出尽量流式处理，不要整文件读进内存。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf78047af31d9c519c2d6fe"><li>能分块就分块，减少一次性大对象复制。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780f6babbd8b9d2a43732"><li>文件保存和转码不要阻塞主线程。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780a0ac96fccffb7e486b"><li>长时间传输要有进度、取消和失败恢复。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780eea601ff20023f78a8"><li>能复用系统文件协调、<code class="notion-inline-code">URLSession</code>、PhotoKit、AVFoundation，就不要自己造一套脆弱管线。</li></ul><div class="notion-text notion-block-37ae7ea2ebf78087b43bfb2a94ebc062">相机场次里讲到的 AVProVideoStorage 也是同一个方向。Apple 说它用于高码率视频的确定性文件写入，让 ProRes 这类高数据率场景的 write performance 更稳定。换句话说，性能不只是峰值速度，也包括持续稳定：不要一开始很快，后面突然卡住、掉帧、写盘抖动。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf780e1ba13fbeac4e51dfb" data-id="37ae7ea2ebf780e1ba13fbeac4e51dfb"><span><div id="37ae7ea2ebf780e1ba13fbeac4e51dfb" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780e1ba13fbeac4e51dfb" title="六、CPU scheduler：让旧设备也更 responsive"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>六、CPU scheduler：让旧设备也更 responsive</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf780c19e7eee7485bcc036">Keynote 里 Apple 单独讲了 CPU scheduler。它说 scheduler 是管理 CPU resources across workloads 的关键系统组件，目标是让正确的工作在正确的时间执行。今年 Apple 进一步优化了 scheduler，让它处理 performance-intensive workloads 时更高效，并把能力带到 iPhone 11 这类旧机型。</div><div class="notion-text notion-block-37ae7ea2ebf780a18af0d154da3be254">这部分对开发者的启发很直接：不要和 scheduler 对着干。</div><div class="notion-text notion-block-37ae7ea2ebf780e7a37deeea96e9c123">系统可以更聪明地调度 CPU，但 App 也要表达正确的意图。不要启动时无脑开一堆高优先级任务，不要把后台同步、日志刷盘、图片处理、数据库 compact、缓存清理都堆到用户刚打开 App 的时刻，也不要把这些任务都塞进 Main Actor。</div><div class="notion-text notion-block-37ae7ea2ebf7801baa78c7ac2c21b7eb">Swift Concurrency 的 priority、cancellation、actor 隔离、后台 task 都应该认真设计。系统 scheduler 再聪明，也救不了一个把所有工作都标成“现在立刻必须做”的 App。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf780d58eaffe28fc969d0a" data-id="37ae7ea2ebf780d58eaffe28fc969d0a"><span><div id="37ae7ea2ebf780d58eaffe28fc969d0a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780d58eaffe28fc969d0a" title="七、网络切换：减少用户手动处理连接的次数"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>七、网络切换：减少用户手动处理连接的次数</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf780ec8424cda3f04e7044">Apple 还提到，iPhone 在蜂窝网络和 Wi-Fi 之间的切换会更无缝。Keynote 里举的例子很日常：路过熟悉的 Wi-Fi 热点、刚下飞机、设备还连着一个看似有信号但实际不好用的网络，用户过去可能会去 Control Center 手动关 Wi-Fi，强行切到蜂窝。</div><div class="notion-text notion-block-37ae7ea2ebf78029b730f3d6aead339e">这也是性能体验的一部分。用户不关心网络状态机怎么工作，只关心“我现在点了，内容有没有继续加载”。如果连接切换卡住，用户感知到的不是网络问题，而是 App 或系统没反应。</div><div class="notion-text notion-block-37ae7ea2ebf780dfb9f6c8691d8f808f">对 App 开发者来说，系统网络切换更好是好事，但 App 自己也要尽量具备恢复能力：</div><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780559a3ed6c33a0dad0c"><li>网络请求要能重试，而不是一次失败就让用户重新操作。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780c1b59cc84a5823edc3"><li>上传下载要支持断点、后台和取消。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780aa980dcace97df2ebf"><li>UI 上要区分“正在恢复连接”和“操作失败”。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780d1bbfad55bfff4f4f9"><li>不要把首屏完全绑定在一次实时网络请求上。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf78053ab29e5a20e442059"><li>弱网和网络切换场景要纳入性能测试。</li></ul><div class="notion-text notion-block-37ae7ea2ebf780df9630fbf93a2cc819">这和 App 启动是同一个问题：不要把用户卡在一个不可恢复的等待里。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf78091b5dfee143b42b4c5" data-id="37ae7ea2ebf78091b5dfee143b42b4c5"><span><div id="37ae7ea2ebf78091b5dfee143b42b4c5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf78091b5dfee143b42b4c5" title="八、交互流畅性：100ms、8.3ms、5ms"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>八、交互流畅性：100ms、8.3ms、5ms</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf780588836ea80f7adf831">Apple 的 <a class="notion-link" href="https://developer.apple.com/documentation/xcode/improving-app-responsiveness" target="_blank" rel="noopener noreferrer">Improving app responsiveness</a> 文档给了几个很有用的阈值：离散点击里的同步主线程工作，粗略目标是小于 100ms；120Hz 设备一帧约 8.3ms，60Hz 一帧约 16.7ms；如果主线程用于更新屏幕的工作少于约 5ms，通常更容易赶上下一帧。</div><table class="notion-simple-table notion-block-d781d953ecb44750bbdb3b0d5e29f88d"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-34588181010e46f082541d3e2175ab9d"><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>场景</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>阈值</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>含义</b></div></td></tr><tr class="notion-simple-table-row notion-block-072551acf9b14bac94561264ca339e71"><td class="" style="width:120px"><div class="notion-simple-table-cell">离散点击后主线程同步工作</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">&lt; 100ms</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">超过后手感开始变钝</div></td></tr><tr class="notion-simple-table-row notion-block-72f0a17b4d9a4cfaa2ef6be6b4ef1def"><td class="" style="width:120px"><div class="notion-simple-table-cell">120Hz 设备一帧</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">~8.3ms</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">多几毫秒就可能掉帧</div></td></tr><tr class="notion-simple-table-row notion-block-4516bf7d602242149e8ead6b75efd5af"><td class="" style="width:120px"><div class="notion-simple-table-cell">60Hz 设备一帧</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">~16.7ms</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">—</div></td></tr><tr class="notion-simple-table-row notion-block-918bd73988504c2f9e90283d2d3b5a53"><td class="" style="width:120px"><div class="notion-simple-table-cell">主线程更新屏幕的预算</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">&lt; ~5ms</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">更容易赶上下一帧</div></td></tr></tbody></table><div class="notion-text notion-block-37ae7ea2ebf78064a0bdfd6c7e32c41c">所以卡顿不一定是“慢很多”才算。滚动时多几毫秒，就可能错过一帧；点击后超过 100ms，手感就开始变钝。性能优化很多时候不是把 1 秒变成 0.5 秒，而是把 12ms 变成 5ms。</div><div class="notion-text notion-block-37ae7ea2ebf78078b12fddd5fa32559b"><a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/268/" target="_blank" rel="noopener noreferrer">WWDC26 Instruments session</a> 给了一个很实用的排查方法：先看 CPU saturation，再看采样数据，再看 execution contention，最后看 system blocking。Time Profiler 看 CPU，Top Functions 找最重函数，Swift Executors 看任务是不是挤在 Main Actor 上，System Trace 看低 CPU 时主线程是不是 blocked 在 I/O、锁或系统调用上。</div><div class="notion-text notion-block-37ae7ea2ebf7800fbc9edab790ac02ee">这里有两个特别值得写进团队 checklist 的例子。</div><div class="notion-text notion-block-37ae7ea2ebf780a094a8c56ceacf197a">一个是缩略图渲染。session 里，多个 <code class="notion-inline-code">renderThumbnail</code> task 看起来是异步任务，但实际继承了 Main Actor context，每个任务在 Main Actor 上跑几百毫秒，和关键 UI 更新抢执行权。加 <code class="notion-inline-code">@concurrent</code> 后，任务从 Main Actor track 移到 global executor track，UI hang 消失，还能并行渲染。</div><div class="notion-text notion-block-37ae7ea2ebf780f7b8f5f971beb92e42">也就是说，Swift Concurrency 不等于自动后台化。<code class="notion-inline-code">async</code> 只是表达挂起点，不代表你的重活一定离开了 Main Actor。</div><div class="notion-text notion-block-37ae7ea2ebf78099b3dee15a9a3ea669">另一个是文件保存。session 里保存文件时 UI 短暂卡住，但 CPU 不高。Time Profiler 看不出“忙”，System Trace 才能看到主线程 blocked，等待外部资源。把 file saving 移出主线程后，Main Actor 才被释放。</div><div class="notion-callout notion-yellow_background_co notion-block-4ebf12150dcc487383bae80cc30c1a00"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="⚠️">⚠️</span></div><div class="notion-callout-text"><div class="notion-text notion-block-ec57f7d64deb465dab092c7e316a4297">这类问题最容易误判：低 CPU 不代表没有性能问题，可能只是主线程在等磁盘、等锁、等系统调用。</div></div></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf7807a9bf9c5cb7b80cc6c" data-id="37ae7ea2ebf7807a9bf9c5cb7b80cc6c"><span><div id="37ae7ea2ebf7807a9bf9c5cb7b80cc6c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf7807a9bf9c5cb7b80cc6c" title="九、SwiftUI：让数据流更懒、更少重复"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>九、SwiftUI：让数据流更懒、更少重复</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf780e78125c959e6aab278">Apple 这次在 SwiftUI 里的几个性能更新，也和上面的方向一致。</div><div class="notion-text notion-block-37ae7ea2ebf780878b3ec38f31db0678"><a class="notion-link" href="https://developer.apple.com/wwdc26/guides/swiftui/" target="_blank" rel="noopener noreferrer">WWDC26 SwiftUI guide</a> 提到，<code class="notion-inline-code">AsyncImage</code> 默认支持标准 HTTP caching，会尊重 server cache headers；需要更多控制时，可以传自定义 <code class="notion-inline-code">URLRequest</code>，或者配置带自定义 <code class="notion-inline-code">URLCache</code> 的 <code class="notion-inline-code">URLSession</code>。<code class="notion-inline-code">@State</code> 变成 macro 后，class 存储在 <code class="notion-inline-code">@State</code> 里会 lazy initialization，并且每个 View lifetime 只创建一次。</div><div class="notion-text notion-block-37ae7ea2ebf780c4a4e4c4d9c08c7286">SwiftUI 新的 Document API 也支持 asynchronous、incremental disk operations，并通过 Foundation Subprogress API 报告进度。这对大文档读写很重要：不要每次都全量、同步、阻塞式处理，而是尽量增量、后台、可进度化。</div><div class="notion-text notion-block-37ae7ea2ebf78045a998e9753de3ebbd">SwiftUI 性能文档还提醒，View body 必须快速计算，因为系统需要在下一帧渲染前完成 View update。Instruments 的 SwiftUI template 会标出 Long View Body Updates，超过 500 microseconds 标橙，超过 1000 microseconds 标红。常见问题不是某个函数慢得离谱，而是一个看起来便宜的 body 被计算了太多次，或者在 <code class="notion-inline-code">body</code>、<code class="notion-inline-code">onAppear</code>、gesture <code class="notion-inline-code">onChanged</code> 里做了复杂工作。</div><div class="notion-text notion-block-37ae7ea2ebf7809e8065e91a9bc5da65">这些改动的共同点是减少不必要工作：少重复加载，少重复分配，少在 UI 出来前抢资源。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf780ca8130e45c565a1859" data-id="37ae7ea2ebf780ca8130e45c565a1859"><span><div id="37ae7ea2ebf780ca8130e45c565a1859" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780ca8130e45c565a1859" title="十、官网里其他性能相关专题：语言、图像、GPU、资源与系统服务"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>十、官网里其他性能相关专题：语言、图像、GPU、资源与系统服务</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf78055af72f1612244c738">除了 keynote 里的启动、照片、AirDrop、外置盘这些结果，WWDC26 官网还有一批更工程向的性能内容。它们不一定都给了一个“提升多少百分比”的数字，但能看出 Apple 这次性能优化的覆盖面：不是只优化系统启动路径，而是从语言、框架、媒体管线、GPU、资源下载和工具链一起往前推。</div><div class="notion-text notion-block-37ae7ea2ebf780a3959ad5d8fae86343">Apple 甚至专门安排了 <a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/8003/" target="_blank" rel="noopener noreferrer">Power and Performance Group Lab</a>，介绍里说可以和 Apple 工程师、设计师深入讨论 WWDC26，并 follow up 这一周最大的 power and performance announcements。这个 lab 页面本身没有展开技术细节，所以我不把它当成某个具体优化的证据；但它说明，性能和功耗并不是这次发布里零散出现的附属话题，而是一个被单独组织起来的主题。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-37ae7ea2ebf780ecb87add5a7b8cc7c0" data-id="37ae7ea2ebf780ecb87add5a7b8cc7c0"><span><div id="37ae7ea2ebf780ecb87add5a7b8cc7c0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780ecb87add5a7b8cc7c0" title="Swift 和 Foundation：把性能控制权下放到代码层"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Swift 和 Foundation：把性能控制权下放到代码层</b></span></span></h4><div class="notion-text notion-block-37ae7ea2ebf7803a80b2db090674aadd"><a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/262/" target="_blank" rel="noopener noreferrer">What’s new in Swift</a> 里有一段专门讲 Performance Tuning。这里的重点不是“Swift 自动更快了”这么简单，而是 Apple 在给性能敏感代码更多可控性。</div><div class="notion-text notion-block-37ae7ea2ebf780ec99e6dd92ad319330">session 提到的 optimizer control 包括 <code class="notion-inline-code">@inline(always)</code> 和 <code class="notion-inline-code">@specialized</code>。这两个工具并不是让业务代码到处加标记，而是给库作者、框架作者、性能敏感路径一个更明确的方式：当你知道某个泛型函数、热路径函数在真实场景里会被频繁调用，就可以更主动地影响编译器优化策略。</div><div class="notion-text notion-block-37ae7ea2ebf7800e828ac1bdde7805d6">同一个 session 还把 Swift 的 ownership system、noncopyable types、borrow/mutate accessors 放在性能语境下介绍。它们背后的方向很清楚：减少不必要的 copy，让 API 能更准确表达“这里是借用”“这里会修改”“这里不应该复制”。对 App 开发者来说，这类能力短期内可能更多出现在底层组件、媒体处理、数据结构和 SDK 里，但它会慢慢改变 Swift 写高性能代码的边界。</div><div class="notion-text notion-block-37ae7ea2ebf78076ab29f32b01cfc3ef">Swift 标准库也新增了 <code class="notion-inline-code">UniqueBox</code>、<code class="notion-inline-code">UniqueArray</code>、<code class="notion-inline-code">Ref</code>、<code class="notion-inline-code">MutableRef</code> 这些类型。它们适合表达唯一所有权、引用语义和可变引用这类更底层的性能需求。Foundation 侧则提到 <code class="notion-inline-code">Data</code>、<code class="notion-inline-code">NSURL</code>、<code class="notion-inline-code">CFURL</code> 有性能改进。也就是说，性能优化并不只发生在 UIKit、SwiftUI 这种 UI 框架里，语言和基础库本身也在减少内存、复制和桥接成本。</div><div class="notion-text notion-block-37ae7ea2ebf78098a02bfc83265125ea">还有一个很有意思的点：Swift 的 WebAssembly / JavascriptKit 改进里，Apple 提到 Swift 和 JavaScript 之间的 safe bridging 最高可以快 40 倍。这个数字不直接服务大多数原生 App，但它很能说明 Apple 的性能方向：跨语言、跨运行时、跨边界的成本，也在被当成正式问题处理。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-37ae7ea2ebf7800bbe74f65c8f854caa" data-id="37ae7ea2ebf7800bbe74f65c8f854caa"><span><div id="37ae7ea2ebf7800bbe74f65c8f854caa" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf7800bbe74f65c8f854caa" title="Core Image RAW：把重计算搬到更合适的硬件和管线里"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Core Image RAW：把重计算搬到更合适的硬件和管线里</b></span></span></h4><div class="notion-text notion-block-37ae7ea2ebf78073bf05cde751b2e4de"><a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/305/" target="_blank" rel="noopener noreferrer">Core Image RAW processing</a> 是另一条很典型的性能线索。RAW 9 使用 Core ML model 来改进 demosaic 和 denoise，并且可以利用 Apple Neural Engine。这里的重点不是“AI 修图更强”，而是图像管线正在把一部分昂贵计算交给更适合的硬件。</div><div class="notion-text notion-block-37ae7ea2ebf780fdbafdcb7f377b049e">这场 session 还把交互编辑和导出分开讲，细节很值得 App 开发者借鉴。交互编辑时，用户拖动滑杆、调曝光、调色温，需要的是低延迟反馈，不一定每一帧都全分辨率、最高质量。Apple 提到可以用 <code class="notion-inline-code">scaleFactor</code> 以屏幕分辨率反复渲染 RAW，用 <code class="notion-inline-code">cacheIntermediates</code> 缓存中间结果，用 Extended Virtual Addressing entitlement 支撑更大的地址空间，还可以渲染到 Metal-backed <code class="notion-inline-code">MTKView</code>。</div><div class="notion-text notion-block-37ae7ea2ebf780f98a5cffef7afa6535">但导出是另一个目标：用户要最终质量和稳定输出，不是每次拖动时的即时反馈。所以导出时，策略会变成关闭 <code class="notion-inline-code">cacheIntermediates</code>、调 <code class="notion-inline-code">memoryLimit</code>、使用 <code class="notion-inline-code">heifRepresentation</code> / <code class="notion-inline-code">jpegRepresentation</code> 这类 API 生成结果。它提醒我们一个很重要的原则：同一个功能，在“交互预览”和“最终输出”里应该有不同的性能策略。</div><div class="notion-text notion-block-37ae7ea2ebf7801d81ebedc7bd23c454">Core Image 还在 <code class="notion-inline-code">CIImageProcessor</code> 里提供了更明确的 tile size 和 temporary buffer 能力。换成人话就是：当处理大图、复杂滤镜或自定义图像算子时，不要假设系统一定能神奇地一次性吞下所有工作。把图像拆成合适的块、控制临时内存、控制中间结果，往往比单纯追求某个滤镜函数更快更重要。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-37ae7ea2ebf7805aab89daf2880fcb69" data-id="37ae7ea2ebf7805aab89daf2880fcb69"><span><div id="37ae7ea2ebf7805aab89daf2880fcb69" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf7805aab89daf2880fcb69" title="Metal 和游戏：用更低渲染成本换更稳定帧率"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Metal 和游戏：用更低渲染成本换更稳定帧率</b></span></span></h4><div class="notion-text notion-block-37ae7ea2ebf780c4abfdfa37a5640d4c"><a class="notion-link" href="https://developer.apple.com/wwdc26/guides/metal/" target="_blank" rel="noopener noreferrer">WWDC26 Metal guide</a> 和 <a class="notion-link" href="https://developer.apple.com/wwdc26/guides/games/" target="_blank" rel="noopener noreferrer">WWDC26 Games guide</a> 里，性能主题更集中在 GPU、游戏和工具链。</div><div class="notion-text notion-block-37ae7ea2ebf7800da170c58ce3c04f6a">MetalFX temporal upscaler 是一个很典型的例子。官网说它可以从更低的渲染分辨率重建细节，从而在更高画质设置下保持流畅帧率。对游戏和实时 3D 来说，这个思路非常直接：不要每一帧都用最高成本硬算全部像素，而是用时间信息、运动向量和上采样把感知质量补回来。</div><div class="notion-text notion-block-37ae7ea2ebf780d880fac7f5076eb811">Metal guide 还提到，可以处理 subrectangles 来支持 dynamic resolution，传入 motion vectors 来节省预处理时间，并用 distortion fields 处理后处理效果。这些细节背后其实是同一个目标：让 GPU 工作量更贴近屏幕真正需要的内容，而不是一刀切地渲染、处理、再丢弃。</div><div class="notion-text notion-block-37ae7ea2ebf78067a324f5be765f1659">在机器学习和图形交叉的地方，Metal 也补了量化 tensor formats 和 scale factors，Metal Performance Primitives 可以压缩 weights，并在 M5 Pro / M5 Max 上使用 Neural Accelerators。这类优化对普通 App 可能不是每天都会碰到，但对本地模型、实时图像、视频和创作工具很关键：模型不是只看参数效果，也要看内存带宽、权重大小和专用硬件利用率。</div><div class="notion-text notion-block-37ae7ea2ebf7805b92c4d4f5079800bf">Games guide 还有两个对 App 开发者很实用的点。一个是 MetricKit 现在可以在报告里包含 Metal frame rate information，用来定位和修复游戏性能问题。也就是说，Apple 在把“帧率”这种过去更依赖自建埋点或开发期工具的指标，往系统级诊断里放。</div><div class="notion-text notion-block-37ae7ea2ebf780babf9ee34ecad75070">另一个是 Managed Background Assets。官网举的场景是语言包这类 essential assets 可以在第一次打开前下载，非必要资源继续在后台下载，从而减少 title screen 上的等待。这个方向和 App 启动优化非常像：把真正必须的东西提前准备，把不必阻塞首屏的东西挪到后台。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-37ae7ea2ebf7803d9a33fd44b472ac26" data-id="37ae7ea2ebf7803d9a33fd44b472ac26"><span><div id="37ae7ea2ebf7803d9a33fd44b472ac26" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf7803d9a33fd44b472ac26" title="Core AI 和 Foundation Models：AI 功能也要看延迟、内存和首用成本"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>Core AI 和 Foundation Models：AI 功能也要看延迟、内存和首用成本</b></span></span></h4><div class="notion-text notion-block-37ae7ea2ebf780db9980c4f3374c97be">WWDC26 官网还有一组和 AI 性能直接相关的内容。<a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/324/" target="_blank" rel="noopener noreferrer">Meet Core AI</a> 把 Core AI 定位成设备端 AI 模型部署框架，覆盖模型转换、App 集成、性能优化、模型 specialization 等完整流程，并强调它会利用 Apple Silicon 上的 CPU、GPU、ANE。这个信息很关键：当越来越多 App 把模型放到本地跑，性能问题就不只是“推理快不快”，还包括模型第一次加载要多久、内存占多少、是否需要提前编译、能不能命中缓存。</div><div class="notion-text notion-block-37ae7ea2ebf7802eafebec989d2364b8">官网里 <a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/326/" target="_blank" rel="noopener noreferrer">Integrate on-device AI models into your app using Core AI</a> 的摘要更直接：它提到可以下载、运行、benchmark 针对 Apple silicon 优化的模型，也会讲 model compilation、on-device specialization，用来 speed up first-time model load，并用 Xcode 里的 Core AI tools profile and optimize runtime performance。换成 App 体验语言，就是 AI 功能也有自己的“启动优化”：第一次点开某个 AI 能力时，不应该把模型准备、specialization、缓存未命中、UI 等待全部堆到用户面前。</div><div class="notion-text notion-block-37ae7ea2ebf780acbd9fea895f69bc1f"><a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/325/" target="_blank" rel="noopener noreferrer">Dive into Core AI model authoring and optimization</a> 则把问题推进到模型作者和底层优化：custom Metal kernels、platform-aware compression、Core AI Debugger、optimized on-device execution。这里的方向和 Metal tensor、量化、MPS 权重压缩是连在一起的：模型质量之外，还要看模型在真实设备上的内存带宽、权重体积、硬件映射和调试可见性。</div><div class="notion-text notion-block-37ae7ea2ebf78008a835e7b7d03dfce1">另外，<a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/243/" target="_blank" rel="noopener noreferrer">Debug and profile agentic app experiences with Instruments</a> 也值得放进性能视角里。它介绍 Xcode 里的 FoundationModels instrument，可以 inspect prompts、analyze latency、trace control flow，尤其是多个 <code class="notion-inline-code">LanguageModelSession</code> 和 profiles 组合起来的 agentic flows。对 App 开发者来说，这意味着 AI 交互不能只看“最终答出来没有”，还要看每一步延迟来自哪里：prompt 构造、模型调用、工具调用、会话切换，还是控制流本身。</div><div class="notion-text notion-block-37ae7ea2ebf78098882bf589bd8f43fe">所以，AI 相关性能其实延续了前面所有原则：能提前准备的提前准备，能缓存的缓存，能分阶段的分阶段；不要把模型加载、specialization、网络请求、工具调用和 UI 阻塞揉成一个黑盒。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-37ae7ea2ebf780bd996cf3324579560d" data-id="37ae7ea2ebf780bd996cf3324579560d"><span><div id="37ae7ea2ebf780bd996cf3324579560d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780bd996cf3324579560d" title="App Intents：系统入口越多，性能越要可扩展"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>App Intents：系统入口越多，性能越要可扩展</b></span></span></h4><div class="notion-text notion-block-37ae7ea2ebf780409388c235a58278d0"><a class="notion-link" href="https://developer.apple.com/videos/play/wwdc2026/345/" target="_blank" rel="noopener noreferrer">App Intents session</a> 里也有性能相关内容。官网摘要提到 <code class="notion-inline-code">EntityCollection</code> improves performance，<code class="notion-inline-code">SyncableEntity</code> 用来跨设备扩展实体同步，long-running intents 需要能处理取消。</div><div class="notion-text notion-block-37ae7ea2ebf7802e9a21c012a40ae831">这块不如启动、相机、Metal 那么显眼，但很有现实意义。现在 App 的入口不只是点图标：Spotlight、Siri、Shortcuts、系统搜索、智能体式交互都可能触发 App 的能力。如果每个入口都要临时查库、拉网、初始化一堆对象，系统入口越多，性能问题就越容易扩散。App Intents 的性能优化本质上是在提醒开发者：实体查询、同步、取消和长任务，也要按系统级入口的规模去设计。</div><div class="notion-text notion-block-37ae7ea2ebf78075aea6d652af7b8de8">把这些官网内容合起来看，WWDC26 的性能主题其实更完整：启动速度是最容易被感知的入口，交互流畅性是用户每天都在感受的底线，传输和网络是跨设备体验的基础，而 Swift、Core Image、Metal、Core AI、Foundation Models、App Intents 这些专题，则是在告诉开发者性能优化应该落到每一层。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-37ae7ea2ebf780c586b1fb4f9f9bc0c6" data-id="37ae7ea2ebf780c586b1fb4f9f9bc0c6"><span><div id="37ae7ea2ebf780c586b1fb4f9f9bc0c6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#37ae7ea2ebf780c586b1fb4f9f9bc0c6" title="十一、给 App 开发者的启发"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>十一、给 App 开发者的启发</b></span></span></h3><div class="notion-text notion-block-37ae7ea2ebf78003a143ffbb1cfaf31d">如果把 WWDC26 这些性能点放在一起，我觉得 Apple 传递的不是“跑分更高”，而是一种更具体的体验目标：</div><div class="notion-callout notion-blue_background_co notion-block-6d8e04fac6e84315a79b9f0cb9b11bca"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🎯">🎯</span></div><div class="notion-callout-text"><div class="notion-text notion-block-b44d0924860944068d236c7132f8a936"><b>用户不应该感知到系统在准备。</b></div></div></div><div class="notion-text notion-block-37ae7ea2ebf780f8b488e4c2d4751e7b">App 启动时，关键数据最好已经在路上。照片拍完后，图库应该尽快可见。传文件时，吞吐应该稳定。网络切换时，连接不应该让用户操心。交互发生时，主线程应该空出来响应用户。旧设备上，调度也应该尽量把有限资源用在刀刃上。图像、模型、资源下载、GPU 渲染和系统入口，也都应该有对应的性能策略，而不是等用户卡住之后再补救。</div><div class="notion-text notion-block-37ae7ea2ebf7807fa9c7ffe3deca4798">对 App 开发者来说，WWDC26 的启发其实很直接：</div><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780cc94a8fba984cf2d12"><li>不要把启动当成一个函数优化，要把它当成一条用户路径优化。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf78096aa00e656fd2b3bcd"><li>不要把首帧当终点，要把“可用”当终点。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780f69494d16c02c72cee"><li>不要只问“App 为什么慢”，先判断瓶颈属于启动、内容加载、I/O、网络、渲染、模型、系统入口还是工具链。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf7807fba69df70e349c475"><li>不要只看平均值，要看 p90、老设备、弱网、网络切换和入口场景。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780188fdcfff11cbd8100"><li>不要把所有初始化都塞进启动期，要分清必须、可延迟、可缓存、可取消。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780779568ff81551e743d"><li>不要让主线程承担业务洁癖，很多工作可以晚一点、轻一点、后台一点。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf78084869dfcdca967ccc4"><li>不要把 <code class="notion-inline-code">async</code> 当成自动性能优化，要确认任务是不是真的离开了 Main Actor。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf7800fb710d47eb6be3fbe"><li>不要只优化峰值速度，也要优化持续稳定性、恢复能力和失败体验。</li></ul><ul class="notion-list notion-list-disc notion-block-37ae7ea2ebf780119fb7e56a3abc96af"><li>不要把预览和导出、首屏和后台、关键资源和非关键资源混成同一套策略。</li></ul><div class="notion-callout notion-gray_background_co notion-block-5e398b736841436eaf22dbf8ad9c2ad4"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🚪">🚪</span></div><div class="notion-callout-text"><div class="notion-text notion-block-2ac8677d0c34483090813976c0bf3213">Apple 这次帮系统把路铺得更早了。但每个 App 还要自己决定：用户点开你的那一秒，你是先把门打开，还是先在门口整理仓库。</div></div></div><div class="notion-blank notion-block-37ae7ea2ebf780168e4ed758b8e7f163"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MCP：Make AI Great Again！]]></title>
            <link>blog.akinaustin.space/article/1e5e7ea2-ebf7-80b5-bf0e-d25fb8ba6ee0</link>
            <guid>blog.akinaustin.space/article/1e5e7ea2-ebf7-80b5-bf0e-d25fb8ba6ee0</guid>
            <pubDate>Wed, 02 Apr 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-1e5e7ea2ebf780b5bf0ed25fb8ba6ee0"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf781698971f0289e9df830" data-id="1e5e7ea2ebf781698971f0289e9df830"><span><div id="1e5e7ea2ebf781698971f0289e9df830" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781698971f0289e9df830" title="MCP使用分享：Make AI Great Again！"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>MCP使用分享：Make AI Great Again！</b></span></span></h2><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf7815cb89df1f7ea1e2c65" data-id="1e5e7ea2ebf7815cb89df1f7ea1e2c65"><span><div id="1e5e7ea2ebf7815cb89df1f7ea1e2c65" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7815cb89df1f7ea1e2c65" title="一、前言+什么是MCP？"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>一、前言+什么是MCP？</b></span></span></h2><ol start="1" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf781a58d0ed27f14a5b112" style="list-style-type:decimal"><li>MCP是什么？</li></ol><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7810fa7a3e2cd44ea3936"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:394px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-2803584670325791900fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694505&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-810f-a7a3-e2cd44ea3936" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf78131a369e370602e9c5b"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:565px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-239473792558120286fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694505&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8131-a369-e370602e9c5b" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781dd9d41cc48454f4480"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-8389594162329149559fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694505&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-81dd-9d41-cc48454f4480" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7816ebcc1d9c860235fd9"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:483px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A4775181183464728746fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694506&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-816e-bcc1-d9c860235fd9" alt="notion image" loading="lazy" decoding="async"/></div></figure><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf7815289d6dc7a10e3c07f" data-id="1e5e7ea2ebf7815289d6dc7a10e3c07f"><span><div id="1e5e7ea2ebf7815289d6dc7a10e3c07f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7815289d6dc7a10e3c07f" title="二、如何使用MCP？"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>二、如何使用MCP？</b></span></span></h2><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-1e5e7ea2ebf78131982ece2d0c53502b" data-id="1e5e7ea2ebf78131982ece2d0c53502b"><span><div id="1e5e7ea2ebf78131982ece2d0c53502b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78131982ece2d0c53502b" title="1. 选取MCP Client"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 选取MCP Client</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf781a8b851c409f41f608e">在这里我选用 VSCode + Cline 作为MCP客户端。安装方法很简单，只需要在VSCode的插件市场中搜索并安装Cline，并且逐步完成注册、配置即可。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf78199af7febc494f0e190"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:161px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-8423015939177160453fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694506&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8199-af7f-ebc494f0e190" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf781a3872fffd5d9e74b1e">我的Cline模型配置(这里我选择了一个免费的DeepSeek版本)</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-1e5e7ea2ebf7817184cfd4fcc1aabb92" data-id="1e5e7ea2ebf7817184cfd4fcc1aabb92"><span><div id="1e5e7ea2ebf7817184cfd4fcc1aabb92" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7817184cfd4fcc1aabb92" title="2. 通过MCP进行信息检索"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 通过MCP进行信息检索</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf78186b769d6fd3683ff1d">点击Cline的MCP服务器市场，并搜索安装 Github</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7813eaaf5d9a5763ed4bb"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:159px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-8846499523630313140fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694506&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-813e-aaf5-d9a5763ed4bb" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf7810b9a92c5ebf320ee3b">安装Github的MCP服务器</div><div class="notion-text notion-block-1e5e7ea2ebf781a4b183d68dea1c0dd6">这里的安装过程也很有趣，点击安装后会自动拉起一个AI聊天窗口，一步一步地问我是否要执行命令来安装，颇有一种 “请了一个AI助手，根据我的命令干活” 的感觉。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf78106bf20f19f622f4043"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:138px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-8874752165718506202fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694506&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8106-bf20-f19f622f4043" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781bca657ca4de712125e"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:149px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A3199050736190816609fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694506&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-81bc-a657-ca4de712125e" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf78161913eea2b0f193b80">这里的两张图片里，AI一步一步的引导我绑定自己的github账号</div><div class="notion-text notion-block-1e5e7ea2ebf781e6abadddc0065543fb">在我允许“助手”访问我的Github账户（给了他Token）后，助手主动的帮我生成了我的mcp配置。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781ac816ec722600b0174"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:630px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-4241784177461982516fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694506&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-81ac-816e-c722600b0174" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf78194b5aff4b038f2005f">没错，连 mcp配置这一步都帮我完成 了！完全不需要我自己处理</div><div class="notion-text notion-block-1e5e7ea2ebf781cb9e76fe795a6d90ca">对于Github MCP工具的使用，也很有想象力</div><div class="notion-text notion-block-1e5e7ea2ebf78119aec4e08d96e51127"><b>自动帮我在Github检索符合我要求的仓库</b></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf78169aceff53e8bd4e141"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:134px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A7586055594080369750fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8169-acef-f53e8bd4e141" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781c8954cfa45eea8c4ff"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:167px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-7560559691125520326fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-81c8-954c-fa45eea8c4ff" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf78159b67ae6c7be08f9b6"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:133px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-4073343455884265881fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8159-b67a-e6c7be08f9b6" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf781e7a384c8025f735fa9">自动帮我clone指定的仓库，并打开项目，进行修改自动clone并打开项目：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7814198a4c0926949a857"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:497px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-8815050913006884790fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8141-98a4-c0926949a857" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf781d9980ec3682b0afdcc">自动修改代码并commit+push：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781819423fa2a32813f64"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:229px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-5478834656788122136fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8181-9423-fa2a32813f64" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7819db99fc24a44fb3f61"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:678px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A3343132544918808661fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-819d-b99f-c24a44fb3f61" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf78172b159dfebf986e666">而创建仓库、分支、分析commit、更新issue、提MR等一系列功能，这个MCP组件也同样支持AI的自动调用！</div><div class="notion-text notion-block-1e5e7ea2ebf781cb96d3da15b482c338">而添加了<b>file system插件</b>之后，更惊喜的一幕出现了，我让他在本地的一个文件夹中帮我找一下tcprelay的脚本位置，他发现没有找到后，首先把搜索范围扩展到了整个电脑，在电脑中没有找到后更是直接在brew中帮我检索到了usbmuxd然后帮我下载...</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781f3887bdc87565a8e3a"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:281px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-32423972893665813fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-81f3-887b-dc87565a8e3a" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781c7962bc96649fa2469"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:272px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A8637864117336339280fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-81c7-962b-c96649fa2469" alt="notion image" loading="lazy" decoding="async"/></div></figure><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-1e5e7ea2ebf78145b83cdf2d6ed75d2a" data-id="1e5e7ea2ebf78145b83cdf2d6ed75d2a"><span><div id="1e5e7ea2ebf78145b83cdf2d6ed75d2a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78145b83cdf2d6ed75d2a" title="3. MCP真正接管浏览器！"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>3. MCP真正接管浏览器！</b></span></span></h4><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7814d9d3ecda093495ed1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:393px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-6597974578464898348fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-814d-9d3e-cda093495ed1" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf781d69994f830c457d22c">项目地址：<a class="notion-link" href="https://github.com/AgentDeskAI/browser-tools-mcp?tab=readme-ov-file" target="_blank" rel="noopener noreferrer">https://github.com/AgentDeskAI/browser-tools-mcp?tab=readme-ov-file</a></div><div class="notion-text notion-block-1e5e7ea2ebf78107a97bfba3227acbba">完成了浏览器插件的安装与MCP插件的安装后，我打开了Keep热力图的页面，并且让MCP简单的帮我分析一下当前页面的网络请求：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7812a9618f24c0c2ef521"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:210px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A4154000496428207327fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-812a-9618-f24c0c2ef521" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf7818f9b71c5b914e31bad">下一步我尝试选中了热力图的展示与列表区，让MCP帮我分析一下当前选中的内容</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7814ab3e8ffa13bec4f82"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:614px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A4131785197939204614fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-814a-b3e8-ffa13bec4f82" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781d5a7fac785a3ad1f79"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:291px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A-2793056730761116065fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694507&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-81d5-a7fa-c785a3ad1f79" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf78161bb7aeaa4159a3ec8">随后我还让他帮我分析了视图遮挡页面的网络日志，帮我总结了一份视图遮挡的报告，并且也可以辅助分析网页的网络攻击风险：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7813ba774ed5e439b8fef"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:211px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A7034299646196288130fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694508&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-813b-a774-ed5e439b8fef" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7812089e1d4e5d4081eb4"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:244px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A4273811532594599770fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694508&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8120-89e1-d4e5d4081eb4" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-1e5e7ea2ebf7814186f5f5299b6681ee"><b>当然，除此之外还有很多其他的用法：如直接操控电子设备、接入SQL数据库等更富有想象力的用法还有待探索！</b></div><div class="notion-text notion-block-1e5e7ea2ebf781d9b62be457119fb8cf">设想一下可以通过与AI Agent的一句话，让他直接去数据库中分析今天的 稳定性/用户体验 报告 ，或者给给Agent描述一个看板，而它直接完成前后端与数据任务的开发与部署，给出看板链接...</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf78107804ee9d8668824af" data-id="1e5e7ea2ebf78107804ee9d8668824af"><span><div id="1e5e7ea2ebf78107804ee9d8668824af" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78107804ee9d8668824af" title="三、快捷的DIY MCP！"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>三、快捷的DIY MCP！</b></span></span></h2><div class="notion-text notion-block-1e5e7ea2ebf781b298e3cedf9de11c49">接下来来创建一个最简单的MCP Server！功能是获取桌面的文件列表</div><div class="notion-text notion-block-1e5e7ea2ebf781439892e4e1156f3184">然后创建一个Python文件：MyMCPServer.py</div><div class="notion-text notion-block-1e5e7ea2ebf78172a9bcd8e89849abff">并且在MCP的配置中添加如下配置，就可以使用MCP了！</div><div class="notion-text notion-block-1e5e7ea2ebf781148a75de2f80d76e3a">在四、中会提到使用腾讯云开发MCP</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf7814bb78cfc32db73fb2d" data-id="1e5e7ea2ebf7814bb78cfc32db73fb2d"><span><div id="1e5e7ea2ebf7814bb78cfc32db73fb2d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7814bb78cfc32db73fb2d" title="四、更多可能性..."><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>四、更多可能性...</b></span></span></h2><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7812fb1f5d13480a3b934"><li>现在，许多大厂也开始进行了MCP相关的布局：</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781bfaedae7709f2e079d"><li>支付宝MCP：自动计算报价并管理、自动处理支付、售后等<a class="notion-link" href="https://www.npmjs.com/package/@alipay/mcp-server-alipay?activeTab=readme" target="_blank" rel="noopener noreferrer">https://www.npmjs.com/package/@alipay/mcp-server-alipay?activeTab=readme</a></li><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781bfaedae7709f2e079d"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf7816ba1cce85f99c76d2f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:700px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A2617670991044309360fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694508&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-816b-a1cc-e85f99c76d2f" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781889cfae56baf7c885f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:700px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A3648957603619695714fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694508&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8188-9cfa-e56baf7c885f" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781a19bf8f275e2c68786"><li>腾讯云 + MCP：快速构建小程序、Web/H5、云函数、数据库等应用<a class="notion-link" href="https://tcb.cloud.tencent.com/" target="_blank" rel="noopener noreferrer">https://tcb.cloud.tencent.com/</a></li><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781a19bf8f275e2c68786"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf78194962be8322a217f15"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:573px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A7628742885863601585fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694508&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8194-962b-e8322a217f15" alt="notion image" loading="lazy" decoding="async"/></div></figure><li>在腾讯云中，支持<b>DIY MCP服务并托管在腾讯云</b>上</li><li>也支持把这些MCP功能<b>赋予给腾讯云Agent</b></li><li>并且支持通过<b>Agent</b>或者<b>本地MCP Host</b>的方式调用，也支持通过SDK把MCP的能力赋予到<b>小程序或Web</b>中。</li></ul></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1e5e7ea2ebf781458b64f63e59006255"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:562px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://docs.corp.kuaishou.com/image/api/external/load/out?code=fcABVn_pSGyf0d8yIAeLfUrW9%3A5526457643611962315fcABVn_pSGyf0d8yIAeLfUrW9%3A1745411694508&amp;spaceId=ef03d79b-c673-411d-b275-bc1b924efd97&amp;t=1e5e7ea2-ebf7-8145-8b64-f63e59006255" alt="notion image" loading="lazy" decoding="async"/></div></figure><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf7817e8358e31ea10631df" data-id="1e5e7ea2ebf7817e8358e31ea10631df"><span><div id="1e5e7ea2ebf7817e8358e31ea10631df" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7817e8358e31ea10631df" title="附录、几个有趣的链接"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>附录、几个有趣的链接</b></span></span></h2><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78139aa3ddc9ec25ea5ca"><li>MCP工具库：<a class="notion-link" href="https://smithery.ai/" target="_blank" rel="noopener noreferrer">https://smithery.ai/</a></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7816798b8c41545dc3a1a"><li>MCP国内工具库：<a class="notion-link" href="https://www.modelscope.cn/mcp" target="_blank" rel="noopener noreferrer">https://www.modelscope.cn/mcp</a></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7816e9312d75934860926"><li>AI工具坟墓：<a class="notion-link" href="https://dang.ai/ai-graveyard" target="_blank" rel="noopener noreferrer">https://dang.ai/ai-graveyard</a></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78183abfcfee005f05921"><li>KMCP：自动写Team（来自天昊） <a class="notion-link" href="https://npm.corp.kuaishou.com/-/web/detail/@ks-kmcp/team-operator/v/1.0.2/" target="_blank" rel="noopener noreferrer">https://npm.corp.kuaishou.com/-/web/detail/@ks-kmcp/team-operator/v/1.0.2/</a></li></ul></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Android火焰图里常见的Slice，他们都是什么？]]></title>
            <link>blog.akinaustin.space/article/2b4e7ea2-ebf7-8059-9825-c6bdd4bcd281</link>
            <guid>blog.akinaustin.space/article/2b4e7ea2-ebf7-8059-9825-c6bdd4bcd281</guid>
            <pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2b4e7ea2ebf780599825c6bdd4bcd281"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2b4e7ea2ebf78044b6e2e4f7455e38d9"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🔥">🔥</span></div><div class="notion-callout-text">火焰图是什么？<div class="notion-text notion-block-2b4e7ea2ebf78067be34e05aa31fe0f9">虽然这篇文章只是准备介绍一些常见的Slice，帮助初学者更好的理解火焰图，但是我认为还是有必要在这里简单介绍一下火焰图：</div><div class="notion-text notion-block-2b4e7ea2ebf780d9b6fac38c6e9c2bdf"><span class="notion-orange"><b>火焰图（Flame Chart）</b></span>是一种性能分析可视化工具。它以时间为横轴，调用栈深度为纵轴，用不同颜色的矩形块展示程序运行时各方法的执行时间和调用关系。</div><div class="notion-text notion-block-2b4e7ea2ebf7803ba2e0d0b2128851b4">火焰图的主要特点：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78064bde9ff97499009b9"><li><b>横轴代表时间——</b>从左到右显示程序执行的时间线</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7804891c0f300bb8e5743"><li><b>纵轴代表调用栈深度——</b>越往上调用层级越深</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7800e9997f41e8baf0d3c"><li><b>矩形块的宽度——</b>表示方法执行的耗时</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780368ebcd0acaea48487"><li><b>颜色区分——</b>不同颜色代表不同的线程、进程或方法类型</li></ul><div class="notion-text notion-block-2b4e7ea2ebf780549583c832ad47a529">开发者可以通过火焰图快速识别性能瓶颈，找出最耗时的方法调用，进行针对性优化。</div><div class="notion-text notion-block-2b4e7ea2ebf7803e8439c4e2aa233938"><b>Perfetto 示例：</b></div><div class="notion-text notion-block-2b4e7ea2ebf780448f02effab6dff68f">Perfetto 是 Google 开发的性能分析工具，可以生成详细的火焰图。你可以访问以下示例查看实际效果：<a class="notion-link" href="https://ui.perfetto.dev/#!/?s=9c1d5c8f8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e8e" target="_blank" rel="noopener noreferrer">Perfetto UI - 示例火焰图</a></div></div></div><div class="notion-text notion-block-2b4e7ea2ebf78065bbb3ceaa652f3b82">打开火焰图后，你可以看到如下的样式</div><div class="notion-blank notion-block-2b4e7ea2ebf7806f87e0dbe3559109ce"> </div><div class="notion-text notion-block-2b4e7ea2ebf78081bb1acef96de2f18c">下边我们来分别介绍一下火焰图视角，双端的App常规运行过程以及常见Slice含义：</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2b4e7ea2ebf780f2bceff9187923750f" data-id="2b4e7ea2ebf780f2bceff9187923750f"><span><div id="2b4e7ea2ebf780f2bceff9187923750f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780f2bceff9187923750f" title="一、火焰图的基本视角"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">一、火焰图的基本视角</span></span></h2><div class="notion-text notion-block-2b4e7ea2ebf780ed9673f0935be3eabc">在分析性能问题时，火焰图提供了多个观察维度：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7807eaa5be95eafd6f55e"><li><b>时间轴视角：</b>横向查看程序执行的完整时间线，识别哪些时间段最耗时</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7800e8481dbd3ee9eb7a8"><li><b>调用栈视角：</b>纵向查看方法调用的层级关系，找出深层调用链</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7808d9187ce257bc28a94"><li><b>线程视角：</b>区分不同线程的工作负载，识别主线程卡顿或后台线程竞争</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7800b832ed501d8f39a4c"><li><b>热点视角：</b>通过矩形块宽度快速定位最耗时的方法或系统调用</li></ul><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2b4e7ea2ebf780939f27cda343ff4e3a" data-id="2b4e7ea2ebf780939f27cda343ff4e3a"><span><div id="2b4e7ea2ebf780939f27cda343ff4e3a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780939f27cda343ff4e3a" title="二、Android App 常规运行过程与常见 Slice"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">二、Android App 常规运行过程与常见 Slice</span></span></h2><div class="notion-callout notion-gray_background_co notion-block-2b4e7ea2ebf780d2841fe73eb4c4f76c"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🔥">🔥</span></div><div class="notion-callout-text"><div class="notion-text notion-block-2b4e7ea2ebf780338caaddd31009f3f4">从火焰图的视角来看，一个 Android App 的典型运行过程可以分为以下几个阶段：</div><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf7801fa205ca13a27f1e05" data-id="2b4e7ea2ebf7801fa205ca13a27f1e05"><span><div id="2b4e7ea2ebf7801fa205ca13a27f1e05" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7801fa205ca13a27f1e05" title="🔷 阶段 1：应用启动与初始化"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔷 阶段 1：应用启动与初始化</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf7806187a2c57a43e52e4a">当用户点击应用图标时，系统首先会通过 <code class="notion-inline-code">zygote</code> 进程 fork 出新的应用进程。在火焰图中，你会看到：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7805d9224d169a7c860b0"><li><code class="notion-inline-code">bindApplication</code> - 应用进程与 ActivityManagerService 建立连接</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78020b309f0d284488d27"><li><code class="notion-inline-code">makeApplication</code> - Application 对象的创建和初始化</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809db5b5eafd5638ecae"><li><code class="notion-inline-code">activityStart</code> → <code class="notion-inline-code">activityResume</code> - 首个 Activity 的启动流程</li></ul><div class="notion-text notion-block-2b4e7ea2ebf780588531fd759ef68390">这个阶段会有大量的 <b>Binder 通信</b>（<code class="notion-inline-code">binderTransaction</code>），因为应用需要与系统服务频繁交互。</div><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf78009be43c017b58d5262" data-id="2b4e7ea2ebf78009be43c017b58d5262"><span><div id="2b4e7ea2ebf78009be43c017b58d5262" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78009be43c017b58d5262" title="🔷 阶段 2：UI 渲染准备"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔷 阶段 2：UI 渲染准备</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78013b79bc29edfb7b6a1">Activity 进入 Resume 状态后，开始准备渲染 UI。火焰图中会出现：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7805eb67ef84fcd46fdf4"><li><code class="notion-inline-code">inflate</code> - 解析 XML 布局文件</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7808aa0f5e9716b43e56d"><li><code class="notion-inline-code">performTraversals</code> - 开始 View 树的遍历</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803d8135eecb9a6ea782"><li><code class="notion-inline-code">measure</code> → <code class="notion-inline-code">layout</code> → <code class="notion-inline-code">draw</code> - View 的测量、布局、绘制三大流程</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780698f7cd70535123cab"><li><code class="notion-inline-code">VSync</code> - 等待垂直同步信号</li></ul><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf7805d9ab4c6d4de8b661c" data-id="2b4e7ea2ebf7805d9ab4c6d4de8b661c"><span><div id="2b4e7ea2ebf7805d9ab4c6d4de8b661c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7805d9ab4c6d4de8b661c" title="🔷 阶段 3：帧渲染循环（主线程 + RenderThread）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔷 阶段 3：帧渲染循环（主线程 + RenderThread）</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78095a4b8f733c1d74021">应用进入稳定运行状态后，每一帧的渲染都会在火焰图中呈现为一个完整的周期：</div><div class="notion-text notion-block-2b4e7ea2ebf780a9946eeae774815bb4"><b>主线程（UI Thread）：</b></div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780fb8f6cf5a1bbde1f4a"><li><code class="notion-inline-code">Choreographer#doFrame</code> - 帧渲染的核心入口，理想情况下每 16.6ms 触发一次（60fps）</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780349046c94bffa2fb93"><li><code class="notion-inline-code">deliverInputEvent</code> / <code class="notion-inline-code">dispatchInput</code> - 处理用户触摸事件</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a0b68ee3b151942228"><li><code class="notion-inline-code">animation</code> / <code class="notion-inline-code">animator</code> - 执行动画</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a1ad68f771fcd3098f"><li><code class="notion-inline-code">performTraversals</code> - 再次遍历 View 树，更新需要重绘的部分</li></ul><div class="notion-text notion-block-2b4e7ea2ebf780bc9cb6cdf9b1e908b9"><b>RenderThread（渲染线程）：</b></div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78044bab0c153b5da4a6f"><li><code class="notion-inline-code">RenderThread#doFrame</code> - RenderThread 接管渲染任务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801ea5d9e11ccf52545e"><li><code class="notion-inline-code">drawFrame</code> - 构建绘制命令</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780d6ab0fceaa4a596706"><li><code class="notion-inline-code">issueDrawCommands</code> - 向 GPU 发送绘制指令</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78068abd6fab1af21bc73"><li><code class="notion-inline-code">eglSwapBuffers</code> - 交换前后缓冲区，将内容显示到屏幕</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780018187fcc325e83a6d"><li><code class="notion-inline-code">GPU Completion</code> - 等待 GPU 完成渲染</li></ul><div class="notion-text notion-block-2b4e7ea2ebf78031b85ed0da9e729a92">在这个过程中，主线程和 RenderThread 是<b>并行工作</b>的。你会在火焰图中看到它们在不同的轨道上同时执行。</div><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf78046bf12c0965eb9a595" data-id="2b4e7ea2ebf78046bf12c0965eb9a595"><span><div id="2b4e7ea2ebf78046bf12c0965eb9a595" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78046bf12c0965eb9a595" title="🔷 阶段 4：列表滚动（RecyclerView 场景）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔷 阶段 4：列表滚动（RecyclerView 场景）</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78059832cc34f491e17ee">当用户滑动列表时，火焰图会显示密集的渲染活动：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801ca1f2db8adaa3adc3"><li><code class="notion-inline-code">RecyclerView#onBindViewHolder</code> - 频繁出现，绑定数据到可见的 item</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780bd83defa037840e381"><li><code class="notion-inline-code">RecyclerView#layoutChildren</code> - 重新布局子 View</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780578155fd12d4958621"><li><code class="notion-inline-code">GapWorker</code> - 后台预加载即将显示的 item</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7802187ebefa8074e5cb7"><li><code class="notion-inline-code">Choreographer#doFrame</code> - 持续的帧渲染</li></ul><div class="notion-text notion-block-2b4e7ea2ebf780b18aa0db708aef346d">如果滑动不流畅，你会看到某些帧的 <code class="notion-inline-code">doFrame</code> 超过 16.6ms，这就是<b>丢帧</b>。</div><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf78054b460c599c80583b8" data-id="2b4e7ea2ebf78054b460c599c80583b8"><span><div id="2b4e7ea2ebf78054b460c599c80583b8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78054b460c599c80583b8" title="🔷 阶段 5：后台任务与 I/O 操作"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔷 阶段 5：后台任务与 I/O 操作</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780808215fc4de0708040">应用运行过程中，后台线程会处理各种任务。在火焰图的其他线程轨道上，你会看到：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780fea701c946931a5de5"><li><code class="notion-inline-code">ThreadPoolExecutor</code> - 线程池执行的任务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780048844fbf565f08e15"><li><code class="notion-inline-code">Dispatchers.IO</code> - Kotlin 协程的 I/O 操作</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780708ad4db663d4f5338"><li><code class="notion-inline-code">sqlite</code> / <code class="notion-inline-code">sqliteQuery</code> - 数据库查询</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801aa94ddb3445da3f80"><li><code class="notion-inline-code">read</code> / <code class="notion-inline-code">write</code> - 文件 I/O</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780618279e3a4cf9f6885"><li><code class="notion-inline-code">binderTransaction</code> - 与系统服务的跨进程通信</li></ul><div class="notion-text notion-block-2b4e7ea2ebf7807f9e51f29a439b0e0e"><b>⚠️ 警告信号：</b>如果这些操作出现在<b>主线程</b>轨道上，说明存在严重的性能问题！</div><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf78002a2afde2dff7c13d1" data-id="2b4e7ea2ebf78002a2afde2dff7c13d1"><span><div id="2b4e7ea2ebf78002a2afde2dff7c13d1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78002a2afde2dff7c13d1" title="🔷 阶段 6：垃圾回收（GC）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔷 阶段 6：垃圾回收（GC）</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780d2b8f3e7d6d678323f">火焰图中会周期性出现 GC 相关的 Slice：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78073a7c1c2c6b3212149"><li><code class="notion-inline-code">Background concurrent copying GC</code> - 后台并发 GC，对性能影响较小</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78032b23efb943facedd4"><li><code class="notion-inline-code">Pause Young</code> / <code class="notion-inline-code">Pause Old</code> - STW（Stop-The-World）类型的 GC，会暂停应用执行</li></ul><div class="notion-text notion-block-2b4e7ea2ebf780d289bcd0a1c6b53905">如果 GC 过于频繁或暂停时间过长，说明存在<b>内存抖动</b>或<b>内存泄漏</b>。</div><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf7809cad9feda1bebcfac8" data-id="2b4e7ea2ebf7809cad9feda1bebcfac8"><span><div id="2b4e7ea2ebf7809cad9feda1bebcfac8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7809cad9feda1bebcfac8" title="🔷 阶段 7：系统服务的协同工作"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔷 阶段 7：系统服务的协同工作</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78007a9e6efcef3eb36a6">在火焰图的系统进程轨道上，你会看到：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803a9974dc51e7690f1e"><li><code class="notion-inline-code">SurfaceFlinger</code> - 负责屏幕合成，将所有应用的 Surface 合成到屏幕上</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780c2b07efe8acdb71e29"><li><code class="notion-inline-code">ActivityManager</code> - 管理 Activity 生命周期</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780eba70dd149260f4c50"><li><code class="notion-inline-code">WindowManager</code> - 管理窗口显示</li></ul><div class="notion-text notion-block-2b4e7ea2ebf7802bbd7ac6c3da3569a2">这些系统服务通过 <code class="notion-inline-code">binderTransaction</code> 与应用进程通信，协调整个系统的运行。</div><h4 class="notion-h notion-h3 notion-block-2b4e7ea2ebf7808aadd3da26b54467a3" data-id="2b4e7ea2ebf7808aadd3da26b54467a3"><span><div id="2b4e7ea2ebf7808aadd3da26b54467a3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7808aadd3da26b54467a3" title="📊 如何读懂这个流程"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">📊 如何读懂这个流程</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf7806a8064dd796e9d098b">在 Perfetto 或其他火焰图工具中：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780898c39cedbcbdd6a8c"><li><b>横向看时间线：</b>从左到右观察应用启动 → UI 渲染 → 用户交互 → 后台任务的完整流程</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809bbaf9c4936d86c44d"><li><b>纵向看调用栈：</b>点击某个 Slice，查看它的父子调用关系</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78017a3d7e293795027b6"><li><b>跨轨道看协作：</b>主线程、RenderThread、后台线程、系统服务如何配合工作</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7806194ebf8da03d70569"><li><b>关注宽度异常的 Slice：</b>它们就是性能瓶颈</li></ul><div class="notion-text notion-block-2b4e7ea2ebf7801d87c9d1dda815c047">下面我们详细介绍各个阶段中常见 Slice 的具体含义：</div></div></div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf780cfbf6fc80a96bf98a7" data-id="2b4e7ea2ebf780cfbf6fc80a96bf98a7"><span><div id="2b4e7ea2ebf780cfbf6fc80a96bf98a7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780cfbf6fc80a96bf98a7" title="🟦 1. 页面启动（Activity 启动）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 1. 页面启动（Activity 启动）</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf7800ea3ffd85d3cd54e58">这个阶段涵盖了从用户点击图标到页面完全可交互的整个过程。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780fea36ac160c431680b" data-id="2b4e7ea2ebf780fea36ac160c431680b"><span><div id="2b4e7ea2ebf780fea36ac160c431680b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780fea36ac160c431680b" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78065a0a6dca21b1078d8"><li><code class="notion-inline-code">activityStart</code> - Activity 启动的开始标记</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780639746e8022ea289f6"><li><code class="notion-inline-code">activityResume</code> - Activity 进入前台可见状态</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780b6a3b4ebcbe8ec7356"><li><code class="notion-inline-code">activityPause</code> - Activity 失去焦点</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a6aec5c4c4dfe607eb"><li><code class="notion-inline-code">activityIdle</code> - Activity 完成所有初始化，进入空闲状态</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78001bbb8fb58993310d8"><li><code class="notion-inline-code">bindApplication</code> - 应用进程绑定到 ActivityManagerService</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7804e9629dbfed7cf7ea4"><li><code class="notion-inline-code">makeApplication</code> - Application 对象创建</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780b098b7ca6eac760e0e"><li><code class="notion-inline-code">inflate</code> - XML 布局文件解析和 View 对象创建</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803c8078eabedaa802cb"><li><code class="notion-inline-code">launchingActivity</code> - 系统层面的 Activity 启动流程</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780de9c8ef405025015ad"><li><code class="notion-inline-code">RelayoutWindow</code> - 窗口重新布局</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf78020b742d80069d57592" data-id="2b4e7ea2ebf78020b742d80069d57592"><span><div id="2b4e7ea2ebf78020b742d80069d57592" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78020b742d80069d57592" title="项目中的自定义埋点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">项目中的自定义埋点：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780e98088eeb1b702ab42"><li><code class="notion-inline-code">K_onCreate_I</code> - onCreate 生命周期埋点</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780819e12cacb1da7931d"><li><code class="notion-inline-code">K_onStart_I</code> - onStart 生命周期埋点</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78068852cc56b685aad8d"><li><code class="notion-inline-code">K_onResume_I</code> - onResume 生命周期埋点</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78090a586fcaf083c52a6"><li><code class="notion-inline-code">K_finishApm_I:ApmTracker</code> - APM 性能监控完成标记</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7803c9c4ade0de9cdea55" data-id="2b4e7ea2ebf7803c9c4ade0de9cdea55"><span><div id="2b4e7ea2ebf7803c9c4ade0de9cdea55" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7803c9c4ade0de9cdea55" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf7802eaafefaafe23b5dbb">如果 <code class="notion-inline-code">inflate</code> 耗时过长，考虑使用异步 inflate 或减少布局层级；如果 <code class="notion-inline-code">bindApplication</code> 到 <code class="notion-inline-code">activityResume</code> 之间时间过长，检查 Application 初始化和 onCreate 中的同步操作。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf7806cb693c950a9bf5297" data-id="2b4e7ea2ebf7806cb693c950a9bf5297"><span><div id="2b4e7ea2ebf7806cb693c950a9bf5297" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7806cb693c950a9bf5297" title="🟦 2. UI 渲染（主线程 + RenderThread）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 2. UI 渲染（主线程 + RenderThread）</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780ed8988ee5bd2f4707a">Android 的 UI 渲染分为主线程的测量/布局/绘制和 RenderThread 的 GPU 渲染两个阶段。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf78028a684dfa2c6b032cd" data-id="2b4e7ea2ebf78028a684dfa2c6b032cd"><span><div id="2b4e7ea2ebf78028a684dfa2c6b032cd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78028a684dfa2c6b032cd" title="主线程渲染 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">主线程渲染 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a2ac8fe2ecc1e0de33"><li><code class="notion-inline-code">Choreographer#doFrame</code> - 帧渲染的核心入口，每 16.6ms（60fps）触发一次</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780549dd5fe69e2536446"><li><code class="notion-inline-code">performTraversals</code> - View 树的遍历，包含 measure、layout、draw 三大流程</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78057846acfdf17e7bbd8"><li><code class="notion-inline-code">executeTraversal</code> - 执行遍历的实际操作</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78070bd6ddad5e05a40bc"><li><code class="notion-inline-code">ViewRootImpl#performTraversals</code> - ViewRootImpl 层面的遍历</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780599c7bea0625ed1b25"><li><code class="notion-inline-code">deliverInputEvent</code> - 输入事件分发</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78031aa0fc8436c09d419"><li><code class="notion-inline-code">InputDispatcher</code> - 系统输入事件调度</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780b99c8cd4e5e00ae2ab"><li><code class="notion-inline-code">dispatchInput</code> - 输入事件派发到具体 View</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf78050b79ceaa5e4496440" data-id="2b4e7ea2ebf78050b79ceaa5e4496440"><span><div id="2b4e7ea2ebf78050b79ceaa5e4496440" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78050b79ceaa5e4496440" title="RenderThread 渲染 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">RenderThread 渲染 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780328908ec631a01db98"><li><code class="notion-inline-code">RenderThread#doFrame</code> - RenderThread 的帧处理</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780c281e5cde3a6d8fbba"><li><code class="notion-inline-code">drawFrame</code> - 绘制一帧</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780aab727fe480e7a84f5"><li><code class="notion-inline-code">flushLayers</code> - 刷新图层到 GPU</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780caa7e2e6e512ca0468"><li><code class="notion-inline-code">issueDrawCommands</code> - 发送绘制命令到 GPU</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7800ea005e4ecc3bca4ae"><li><code class="notion-inline-code">eglSwapBuffers</code> - 交换前后缓冲区，显示到屏幕</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780ee892ee11ed2fc4324"><li><code class="notion-inline-code">GPU Completion</code> - GPU 完成渲染</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7803b9456d01ade55f8af" data-id="2b4e7ea2ebf7803b9456d01ade55f8af"><span><div id="2b4e7ea2ebf7803b9456d01ade55f8af" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7803b9456d01ade55f8af" title="动画相关："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">动画相关：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a1a5b2cfc4def976fb"><li><code class="notion-inline-code">animation</code> - 动画执行</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7800a9f16f51a52e8743a"><li><code class="notion-inline-code">animator</code> - Animator 动画</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780da959fc18e7409d0dd"><li><code class="notion-inline-code">updateViewHierarchy</code> - 更新 View 层级</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803a846fd33681cf6e2f"><li><code class="notion-inline-code">View#draw</code> - View 的绘制方法</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7802eaae5d534d9d2d839" data-id="2b4e7ea2ebf7802eaae5d534d9d2d839"><span><div id="2b4e7ea2ebf7802eaae5d534d9d2d839" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7802eaae5d534d9d2d839" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78026833cd86100807377">如果 <code class="notion-inline-code">Choreographer#doFrame</code> 超过 16ms，说明丢帧；如果 <code class="notion-inline-code">performTraversals</code> 耗时长，检查 measure/layout 复杂度；如果 <code class="notion-inline-code">eglSwapBuffers</code> 等待时间长，说明 GPU 过载或过度绘制。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf7808ab5f1d2806dfb0119" data-id="2b4e7ea2ebf7808ab5f1d2806dfb0119"><span><div id="2b4e7ea2ebf7808ab5f1d2806dfb0119" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7808ab5f1d2806dfb0119" title="🟦 3. View 测量和布局"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 3. View 测量和布局</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780f698c2e69124a60e9c">这是 UI 渲染流程中的前两个阶段，决定了每个 View 的大小和位置。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7801192afea1f609f8716" data-id="2b4e7ea2ebf7801192afea1f609f8716"><span><div id="2b4e7ea2ebf7801192afea1f609f8716" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7801192afea1f609f8716" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809cb927dc673e499ba2"><li><code class="notion-inline-code">measure</code> - 测量阶段总体标记</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803ba279e6ee2f48aab3"><li><code class="notion-inline-code">onMeasure</code> - 每个 View 的测量方法</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780d3a3dedecadf1faaa4"><li><code class="notion-inline-code">performMeasure</code> - 执行测量流程</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780c4a167c6e55d68ad83"><li><code class="notion-inline-code">layout</code> - 布局阶段总体标记</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780059451febc31bda83c"><li><code class="notion-inline-code">onLayout</code> - 每个 ViewGroup 的布局方法</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809290ccc688368e23e0"><li><code class="notion-inline-code">performLayout</code> - 执行布局流程</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801b8145d946497facc4"><li><code class="notion-inline-code">requestLayout</code> - 请求重新布局</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780b98fa6cb71b856678a" data-id="2b4e7ea2ebf780b98fa6cb71b856678a"><span><div id="2b4e7ea2ebf780b98fa6cb71b856678a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780b98fa6cb71b856678a" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf7803c8843f075061fe187">频繁的 <code class="notion-inline-code">requestLayout</code> 会导致重复测量和布局；嵌套过深的 ViewGroup（如多层 LinearLayout）会导致多次 measure；使用 ConstraintLayout 可以减少布局层级。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf78068936fdc20a757ccb6" data-id="2b4e7ea2ebf78068936fdc20a757ccb6"><span><div id="2b4e7ea2ebf78068936fdc20a757ccb6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78068936fdc20a757ccb6" title="🟦 4. RecyclerView / ListView"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 4. RecyclerView / ListView</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780de8cc0e24f22e09607">列表是 App 中最常见的 UI 组件，其性能直接影响用户体验。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7808183b6fff4743ec908" data-id="2b4e7ea2ebf7808183b6fff4743ec908"><span><div id="2b4e7ea2ebf7808183b6fff4743ec908" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7808183b6fff4743ec908" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780339922c3c7557c4acf"><li><code class="notion-inline-code">RecyclerView#onBindViewHolder</code> - 绑定数据到 ViewHolder</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780cba240fa44058c3e5c"><li><code class="notion-inline-code">RecyclerView#onCreateViewHolder</code> - 创建新的 ViewHolder</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780208257fc7f705a2a16"><li><code class="notion-inline-code">RecyclerView#layoutChildren</code> - 布局子 View</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803d880ee48bb3975785"><li><code class="notion-inline-code">recycler#bind</code> - 回收池绑定操作</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780c2947ad25eb595931c"><li><code class="notion-inline-code">recycler#prefetch</code> - 预取机制，提前创建/绑定即将显示的 item</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809f8062e326948ef435"><li><code class="notion-inline-code">GapWorker</code> - RecyclerView 的后台预加载工作线程</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780cfa5cdf3ac62cd58c5" data-id="2b4e7ea2ebf780cfa5cdf3ac62cd58c5"><span><div id="2b4e7ea2ebf780cfa5cdf3ac62cd58c5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780cfa5cdf3ac62cd58c5" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf7802a839fe1fe73ce7210">如果 <code class="notion-inline-code">onBindViewHolder</code> 耗时长，避免在其中进行复杂计算或 I/O 操作；如果 <code class="notion-inline-code">onCreateViewHolder</code> 频繁出现，检查 RecycledViewPool 配置；启用 <code class="notion-inline-code">setItemViewCacheSize</code> 和预取机制可以改善滑动流畅度。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf7807a83ebc9f5f77f1b43" data-id="2b4e7ea2ebf7807a83ebc9f5f77f1b43"><span><div id="2b4e7ea2ebf7807a83ebc9f5f77f1b43" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7807a83ebc9f5f77f1b43" title="🟦 5. I/O 与 Binder 通信"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 5. I/O 与 Binder 通信</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf7809a9dd5f5d6c47a2ce6">I/O 操作和跨进程通信是常见的性能瓶颈。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780f1937df534ba1d8d02" data-id="2b4e7ea2ebf780f1937df534ba1d8d02"><span><div id="2b4e7ea2ebf780f1937df534ba1d8d02" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780f1937df534ba1d8d02" title="Binder 相关 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Binder 相关 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780ddad49d72882a041f8"><li><code class="notion-inline-code">binderTransaction</code> - Binder 事务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78045af41faebbd609bcd"><li><code class="notion-inline-code">binderCallback</code> - Binder 回调</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78082a103e8da56e83916"><li><code class="notion-inline-code">transact</code> - Binder 调用</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780c6bcbcd04941d919d9" data-id="2b4e7ea2ebf780c6bcbcd04941d919d9"><span><div id="2b4e7ea2ebf780c6bcbcd04941d919d9" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780c6bcbcd04941d919d9" title="I/O 相关 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">I/O 相关 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7808f8da5e8bbcd83c0e4"><li><code class="notion-inline-code">read</code> - 文件读取</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78093940ecae8e6e760c2"><li><code class="notion-inline-code">write</code> - 文件写入</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780bba130d34cb894b2bd"><li><code class="notion-inline-code">FileSystem#read</code> - 文件系统读操作</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803582e7fd0b34d8679d"><li><code class="notion-inline-code">FileSystem#open</code> - 打开文件</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780c283a4c98aeb3a12c2"><li><code class="notion-inline-code">sqlite</code> - SQLite 数据库操作</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7805e93adeef9bbb76b33"><li><code class="notion-inline-code">sqliteQuery</code> - SQL 查询</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780ffb3d1dd13b9c32d1f"><li><code class="notion-inline-code">cursorWindow</code> - Cursor 数据窗口操作</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780ed874ad6f3ef344324" data-id="2b4e7ea2ebf780ed874ad6f3ef344324"><span><div id="2b4e7ea2ebf780ed874ad6f3ef344324" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780ed874ad6f3ef344324" title="系统调用："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">系统调用：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809186c3edc08813bed9"><li><code class="notion-inline-code">epoll_wait</code> - 等待 I/O 事件</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7802cba99fc1a40f2219a"><li><code class="notion-inline-code">futex</code> - 线程同步原语</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7804c8b9ec03d6aa41e72" data-id="2b4e7ea2ebf7804c8b9ec03d6aa41e72"><span><div id="2b4e7ea2ebf7804c8b9ec03d6aa41e72" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7804c8b9ec03d6aa41e72" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780adbdb2d2b47e0216ba">主线程中出现 <code class="notion-inline-code">read</code>、<code class="notion-inline-code">write</code>、<code class="notion-inline-code">sqlite</code> 说明存在主线程 I/O，应移到后台线程；频繁的 <code class="notion-inline-code">binderTransaction</code> 可能导致跨进程通信开销过大。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf780ecb2e8cef73a5ad11a" data-id="2b4e7ea2ebf780ecb2e8cef73a5ad11a"><span><div id="2b4e7ea2ebf780ecb2e8cef73a5ad11a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780ecb2e8cef73a5ad11a" title="🟦 6. 线程池与协程"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 6. 线程池与协程</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf78092b3bbd1093dbd171b">Android 中的并发编程工具。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7809e8e56df20d6693cd3" data-id="2b4e7ea2ebf7809e8e56df20d6693cd3"><span><div id="2b4e7ea2ebf7809e8e56df20d6693cd3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7809e8e56df20d6693cd3" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7805f8020d691dd781233"><li><code class="notion-inline-code">ForkJoinPool</code> - Fork/Join 框架</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78087ba6ae324d2b86ab7"><li><code class="notion-inline-code">ThreadPoolExecutor</code> - 线程池执行器</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78025abe4d145031ae78c"><li><code class="notion-inline-code">AsyncTask</code> - 异步任务（已废弃）</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801f8b1bf89c4288a005"><li><code class="notion-inline-code">HandlerThread</code> - 带 Looper 的后台线程</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7807a9abbca424344991b"><li><code class="notion-inline-code">Looper</code> - 消息循环</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780db8ea8e81dd6040d05"><li><code class="notion-inline-code">JobScheduler</code> - 系统任务调度</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780478df7eeb94b84ca90"><li><code class="notion-inline-code">WorkManager</code> - 后台任务管理</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78026a994d2ccd5fb3410"><li><code class="notion-inline-code">Dispatchers.IO</code> - Kotlin 协程 IO 调度器</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780fdaa54e25f704633ea"><li><code class="notion-inline-code">Dispatchers.Default</code> - Kotlin 协程默认调度器</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7804f8cdcd09d3ad7f262" data-id="2b4e7ea2ebf7804f8cdcd09d3ad7f262"><span><div id="2b4e7ea2ebf7804f8cdcd09d3ad7f262" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7804f8cdcd09d3ad7f262" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780f5aad3f4f29d731601">合理配置线程池大小，避免线程数过多导致上下文切换；使用协程可以减少线程创建开销。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf780b19fc1e4686f4b145b" data-id="2b4e7ea2ebf780b19fc1e4686f4b145b"><span><div id="2b4e7ea2ebf780b19fc1e4686f4b145b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780b19fc1e4686f4b145b" title="🟦 7. GC（垃圾回收）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 7. GC（垃圾回收）</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf78058b1ffd1a44e943e55">GC 会暂停应用执行，是卡顿的常见原因。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf78065a2bcf6b22148d770" data-id="2b4e7ea2ebf78065a2bcf6b22148d770"><span><div id="2b4e7ea2ebf78065a2bcf6b22148d770" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78065a2bcf6b22148d770" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780769a29e7c2821facac"><li><code class="notion-inline-code">Background concurrent copying GC</code> - 后台并发复制 GC</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780bfae9dfd97cae4169e"><li><code class="notion-inline-code">Concurrent mark sweep</code> - 并发标记清除</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780d694d9fea96b7f28d3"><li><code class="notion-inline-code">Concurrent mark</code> - 并发标记阶段</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78052a2eae562257e53f0"><li><code class="notion-inline-code">Concurrent sweep</code> - 并发清除阶段</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7807a9b78ceb489896692"><li><code class="notion-inline-code">Pause Young</code> - 年轻代 GC 暂停</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780b586ece500ad01bc2e"><li><code class="notion-inline-code">Pause Old</code> - 老年代 GC 暂停</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78094976ef24a5a51efd3"><li><code class="notion-inline-code">HeapTrim</code> - 堆内存整理</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78071a0acd187151eee53"><li><code class="notion-inline-code">TrimHeap</code> - 堆内存裁剪</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7805cbbffcd8099bbf7ca" data-id="2b4e7ea2ebf7805cbbffcd8099bbf7ca"><span><div id="2b4e7ea2ebf7805cbbffcd8099bbf7ca" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7805cbbffcd8099bbf7ca" title="项目中的自定义标记："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">项目中的自定义标记：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780db88a9dbe366620810"><li><code class="notion-inline-code">G_onTrimMemory</code> - 内存裁剪回调</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780868a8ad5b6c1520eac"><li><code class="notion-inline-code">GC_YoungGeneration</code> - 年轻代 GC</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a38665cdb9b2a9a1c7"><li><code class="notion-inline-code">GC_Concurrent</code> - 并发 GC</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7800ea969fe7f505b5cdb" data-id="2b4e7ea2ebf7800ea969fe7f505b5cdb"><span><div id="2b4e7ea2ebf7800ea969fe7f505b5cdb" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7800ea969fe7f505b5cdb" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78032823ce3570fa776c4">频繁的 GC 说明内存抖动，检查是否有大量临时对象创建；<code class="notion-inline-code">Pause</code> 类型的 GC 会导致明显卡顿。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf7800d97f1d4ca45e8062b" data-id="2b4e7ea2ebf7800d97f1d4ca45e8062b"><span><div id="2b4e7ea2ebf7800d97f1d4ca45e8062b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7800d97f1d4ca45e8062b" title="🟦 8. 系统服务"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 8. 系统服务</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf7804a9758f09b89e12eda">Android 系统服务的调用。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7803aa8b2ecdbc2c0acd4" data-id="2b4e7ea2ebf7803aa8b2ecdbc2c0acd4"><span><div id="2b4e7ea2ebf7803aa8b2ecdbc2c0acd4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7803aa8b2ecdbc2c0acd4" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78063b7c7c9cbb17f3b03"><li><code class="notion-inline-code">SurfaceFlinger</code> - 屏幕合成服务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780be89f9c333dc6ca00e"><li><code class="notion-inline-code">HWUI</code> - 硬件加速 UI 渲染</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7805799cbe48b8ef61542"><li><code class="notion-inline-code">VSync</code> - 垂直同步信号</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78037a097e903e94cea21"><li><code class="notion-inline-code">performSurfaceTransaction</code> - Surface 事务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78013bd40fef221cf7f18"><li><code class="notion-inline-code">WindowManager</code> - 窗口管理服务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780608358ec1f33fab5db"><li><code class="notion-inline-code">ActivityManager</code> - Activity 管理服务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a780cfc26509ecc238"><li><code class="notion-inline-code">PackageManager</code> - 包管理服务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780bb93cffa3d28c9c0ba"><li><code class="notion-inline-code">zygote64</code> - 应用进程孵化器</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7805da86ee74f208f31ee"><li><code class="notion-inline-code">dex2oat</code> - DEX 到 OAT 编译</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7806fae28f65b6710101a"><li><code class="notion-inline-code">dexopt</code> - DEX 优化</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7807a8843ebc836d82a05" data-id="2b4e7ea2ebf7807a8843ebc836d82a05"><span><div id="2b4e7ea2ebf7807a8843ebc836d82a05" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7807a8843ebc836d82a05" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780e79f40f6f95eacf2db">首次安装或系统升级后的 <code class="notion-inline-code">dex2oat</code> 会导致应用启动变慢；频繁的 <code class="notion-inline-code">WindowManager</code> 调用可能影响 UI 响应。</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2b4e7ea2ebf78065a65ad93117ec2b0a" data-id="2b4e7ea2ebf78065a65ad93117ec2b0a"><span><div id="2b4e7ea2ebf78065a65ad93117ec2b0a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78065a65ad93117ec2b0a" title="三、iOS App 常规运行过程与常见 Slice"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">三、iOS App 常规运行过程与常见 Slice</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf780859892f6512f7263d1" data-id="2b4e7ea2ebf780859892f6512f7263d1"><span><div id="2b4e7ea2ebf780859892f6512f7263d1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780859892f6512f7263d1" title="🟦 1. 页面启动与生命周期"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 1. 页面启动与生命周期</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780f9beeac2d009c8263c">iOS 的页面生命周期与 Android 类似，但使用不同的方法名。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780c0aa55ef5715b7a44f" data-id="2b4e7ea2ebf780c0aa55ef5715b7a44f"><span><div id="2b4e7ea2ebf780c0aa55ef5715b7a44f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780c0aa55ef5715b7a44f" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780ff915dc0c81fb60bbc"><li><code class="notion-inline-code">-[UIApplication _run]</code> - UIApplication 运行循环</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78069bf92d931a239ed49"><li><code class="notion-inline-code">-[UIViewController viewDidLoad]</code> - 视图加载完成</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78002991ec4c2874ff234"><li><code class="notion-inline-code">-[UIViewController viewWillAppear]</code> - 视图即将出现</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780249e79f628e0ff51dd"><li><code class="notion-inline-code">-[UIViewController viewDidAppear]</code> - 视图已经出现</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780f38b8dc3cba59289ad"><li><code class="notion-inline-code">-[UIViewController viewWillDisappear]</code> - 视图即将消失</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78046b3e9dfb1ac24f059"><li><code class="notion-inline-code">applicationDidFinishLaunching</code> - 应用启动完成</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78004a836cfa29e7d650f"><li><code class="notion-inline-code">applicationWillEnterForeground</code> - 应用即将进入前台</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78030a3c2f03688103e91"><li><code class="notion-inline-code">loadView</code> - 加载视图</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780eda5b3dbe051199bc5"><li><code class="notion-inline-code">performLayout</code> - 执行布局</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf78065ad82f17a246457f0" data-id="2b4e7ea2ebf78065ad82f17a246457f0"><span><div id="2b4e7ea2ebf78065ad82f17a246457f0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78065ad82f17a246457f0" title="项目中的自定义埋点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">项目中的自定义埋点：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78093b87bd63ad2c731f5"><li><code class="notion-inline-code">PageStart</code> - 页面启动</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803cb439defb209d775e"><li><code class="notion-inline-code">PageAppear</code> - 页面出现</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78053861ed0b32b2e9060"><li><code class="notion-inline-code">LoadView</code> - 视图加载</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780de98ebd3f3d46298bc" data-id="2b4e7ea2ebf780de98ebd3f3d46298bc"><span><div id="2b4e7ea2ebf780de98ebd3f3d46298bc" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780de98ebd3f3d46298bc" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78085a36ef1537af6b174">避免在 <code class="notion-inline-code">viewDidLoad</code> 中执行耗时操作；将重量级初始化延迟到 <code class="notion-inline-code">viewDidAppear</code> 之后。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf780d8b1f7d2a4aeeb2edd" data-id="2b4e7ea2ebf780d8b1f7d2a4aeeb2edd"><span><div id="2b4e7ea2ebf780d8b1f7d2a4aeeb2edd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780d8b1f7d2a4aeeb2edd" title="🟦 2. Runloop（主线程事件循环）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 2. Runloop（主线程事件循环）</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780acbbf3fe047e67d363">Runloop 是 iOS 主线程的核心机制，卡顿分析的关键。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7801dbeebf4fc335edabe" data-id="2b4e7ea2ebf7801dbeebf4fc335edabe"><span><div id="2b4e7ea2ebf7801dbeebf4fc335edabe" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7801dbeebf4fc335edabe" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780aa81aec227ff092bfa"><li><code class="notion-inline-code">kCFRunLoopBeforeTimers</code> - 即将处理 Timer</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780bd963deb82892da5b2"><li><code class="notion-inline-code">kCFRunLoopBeforeSources</code> - 即将处理 Source</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780e6a9c5e75767a40ed2"><li><code class="notion-inline-code">kCFRunLoopBeforeWaiting</code> - 即将进入休眠</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780e791f2f9237913dca4"><li><code class="notion-inline-code">kCFRunLoopAfterWaiting</code> - 刚从休眠中唤醒</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780d4ada1d2b1eaef8a34"><li><code class="notion-inline-code">kCFRunLoopExit</code> - 退出 Runloop</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7806b8d1bef7df85d9901"><li><code class="notion-inline-code">dispatch_main</code> - 主队列任务</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803891a1e33a90232785"><li><code class="notion-inline-code">dispatch_async</code> - 异步任务分发</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801696e8efc5a075b989"><li><code class="notion-inline-code">mach_msg</code> - Mach 消息传递</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780e7aeccfaa41d4afbd7" data-id="2b4e7ea2ebf780e7aeccfaa41d4afbd7"><span><div id="2b4e7ea2ebf780e7aeccfaa41d4afbd7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780e7aeccfaa41d4afbd7" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78013a390eca2a06021ef">如果 <code class="notion-inline-code">kCFRunLoopBeforeSources</code> 到 <code class="notion-inline-code">kCFRunLoopBeforeWaiting</code> 之间时间过长，说明主线程有耗时操作；监控 Runloop 状态可以实现卡顿检测。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf780f098e5e1358095688a" data-id="2b4e7ea2ebf780f098e5e1358095688a"><span><div id="2b4e7ea2ebf780f098e5e1358095688a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780f098e5e1358095688a" title="🟦 3. Core Animation 渲染"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 3. Core Animation 渲染</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780a6a165d694dfe61380">iOS 的渲染框架，负责所有动画和屏幕更新。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7806d991cf144ea367cf4" data-id="2b4e7ea2ebf7806d991cf144ea367cf4"><span><div id="2b4e7ea2ebf7806d991cf144ea367cf4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7806d991cf144ea367cf4" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7806097c2f0e4ae0d6eed"><li><code class="notion-inline-code">CA::Transaction::commit</code> - Core Animation 事务提交</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780818336fd0effbe455a"><li><code class="notion-inline-code">CA::Render::Frame</code> - 渲染一帧</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78002a6e5f6b403252cfe"><li><code class="notion-inline-code">CA::Display::DisplayLink</code> - 显示链接（类似 Android 的 Choreographer）</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801a9310dc036fe34ad6"><li><code class="notion-inline-code">prepareCommit</code> - 准备提交</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809cbe7fca0d0b9730e5"><li><code class="notion-inline-code">commit</code> - 提交渲染</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803ea4dfc6280b657b9a"><li><code class="notion-inline-code">render</code> - 渲染操作</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803481f9d9985c9ca7eb"><li><code class="notion-inline-code">layoutSubviews</code> - 布局子视图</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78030af8afc2ecbefe428"><li><code class="notion-inline-code">drawRect:</code> - 自定义绘制</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78006bac1c370569644b2"><li><code class="notion-inline-code">UIRenderingServer</code> - UI 渲染服务</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf78073a4d6e35962ccd3f7" data-id="2b4e7ea2ebf78073a4d6e35962ccd3f7"><span><div id="2b4e7ea2ebf78073a4d6e35962ccd3f7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78073a4d6e35962ccd3f7" title="常见卡顿点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">常见卡顿点：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780d89622d919b5f0e82e"><li><code class="notion-inline-code">CA::Transaction::commit</code> - CPU 到 GPU 的数据传输和同步</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780949d17c9aaa7e5332b"><li><code class="notion-inline-code">presentation update</code> - 呈现更新</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a9b54bc58bb18970bd"><li><code class="notion-inline-code">CA::Render::Server</code> - 渲染服务器处理</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7808b9004e3280cc264ca" data-id="2b4e7ea2ebf7808b9004e3280cc264ca"><span><div id="2b4e7ea2ebf7808b9004e3280cc264ca" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7808b9004e3280cc264ca" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780cf9b13f75a619083a4">如果 <code class="notion-inline-code">CA::Transaction::commit</code> 耗时长，检查 layer 数量和复杂度；避免在 <code class="notion-inline-code">drawRect:</code> 中进行复杂绘制；使用 <code class="notion-inline-code">shouldRasterize</code> 可以缓存复杂 layer。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf7803e880be3dfdc758c8a" data-id="2b4e7ea2ebf7803e880be3dfdc758c8a"><span><div id="2b4e7ea2ebf7803e880be3dfdc758c8a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7803e880be3dfdc758c8a" title="🟦 4. AutoLayout / SwiftUI"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 4. AutoLayout / SwiftUI</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780a98df7d67442c17d67">iOS 的布局系统。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780d18838c144e863284a" data-id="2b4e7ea2ebf780d18838c144e863284a"><span><div id="2b4e7ea2ebf780d18838c144e863284a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780d18838c144e863284a" title="AutoLayout Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">AutoLayout Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78095af54ddd70a98f552"><li><code class="notion-inline-code">-[UIView _layoutSubviews]</code> - 布局子视图</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780899686dc8f548f5e72"><li><code class="notion-inline-code">AutoLayout</code> - 自动布局计算</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78051ba3ef8b16a5ae15c"><li><code class="notion-inline-code">layoutEngine</code> - 布局引擎</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7807094aafd64680f1841" data-id="2b4e7ea2ebf7807094aafd64680f1841"><span><div id="2b4e7ea2ebf7807094aafd64680f1841" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7807094aafd64680f1841" title="SwiftUI Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">SwiftUI Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78078b6e5d69da54813fa"><li><code class="notion-inline-code">SwiftUI.Update</code> - SwiftUI 更新</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780f59791e27aafec8c9a"><li><code class="notion-inline-code">SwiftUI.Render</code> - SwiftUI 渲染</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7800aa3f6d44418d64095"><li><code class="notion-inline-code">SwiftUI.Body</code> - SwiftUI body 计算</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780b186f3f17a3b18b6c7" data-id="2b4e7ea2ebf780b186f3f17a3b18b6c7"><span><div id="2b4e7ea2ebf780b186f3f17a3b18b6c7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780b186f3f17a3b18b6c7" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78001af2ece4fa4631c93">复杂的 AutoLayout 约束会导致计算耗时；减少约束数量或使用 frame 布局可以提升性能；SwiftUI 的 body 应尽量轻量。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf780b2ad6bd009732873f5" data-id="2b4e7ea2ebf780b2ad6bd009732873f5"><span><div id="2b4e7ea2ebf780b2ad6bd009732873f5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780b2ad6bd009732873f5" title="🟦 5. TableView / CollectionView"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 5. TableView / CollectionView</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf7804f887ef9a9646218ee">iOS 的列表组件。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780d5a4dbfece92055508" data-id="2b4e7ea2ebf780d5a4dbfece92055508"><span><div id="2b4e7ea2ebf780d5a4dbfece92055508" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780d5a4dbfece92055508" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780f3b049e50c4d087875"><li><code class="notion-inline-code">cellForRowAtIndexPath:</code> - 获取 cell</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78037a541d1a414a095a0"><li><code class="notion-inline-code">heightForRowAtIndexPath:</code> - 计算行高</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7807c8e4be7c6a567e5e9"><li><code class="notion-inline-code">willDisplayCell:</code> - cell 即将显示</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7807ebf88f59badb1dcf1"><li><code class="notion-inline-code">layoutSubviews</code> - cell 布局子视图</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78035ab01f7a273a806b1"><li><code class="notion-inline-code">reloadData</code> - 重新加载数据</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78060bf5ef5acb4d21060"><li><code class="notion-inline-code">performBatchUpdates</code> - 批量更新</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780fbba72cf49c01b4fd6" data-id="2b4e7ea2ebf780fbba72cf49c01b4fd6"><span><div id="2b4e7ea2ebf780fbba72cf49c01b4fd6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780fbba72cf49c01b4fd6" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf78075afdbc4585bbe144c">缓存 cell 高度避免重复计算；在 <code class="notion-inline-code">cellForRowAtIndexPath:</code> 中避免耗时操作；使用 <code class="notion-inline-code">estimatedRowHeight</code> 可以提升加载速度。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf7801c9d61d6521664bac9" data-id="2b4e7ea2ebf7801c9d61d6521664bac9"><span><div id="2b4e7ea2ebf7801c9d61d6521664bac9" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7801c9d61d6521664bac9" title="🟦 6. I/O 与系统调用"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 6. I/O 与系统调用</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780b38d57c356146c7e38">iOS 的文件和网络操作。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780cea1e5e4ae0da3f325" data-id="2b4e7ea2ebf780cea1e5e4ae0da3f325"><span><div id="2b4e7ea2ebf780cea1e5e4ae0da3f325" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780cea1e5e4ae0da3f325" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780369863ed87012f6385"><li><code class="notion-inline-code">read</code> - 读取</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7801f9097f31c51e479dd"><li><code class="notion-inline-code">write</code> - 写入</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7804ea8aadba349edf092"><li><code class="notion-inline-code">fsync</code> - 文件同步</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780c5b778fb3da7c213ac"><li><code class="notion-inline-code">open</code> - 打开文件</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780c08917cdf73c53d144"><li><code class="notion-inline-code">close</code> - 关闭文件</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780bb8ac0c083fcd83118"><li><code class="notion-inline-code">SQLITE</code> - SQLite 数据库</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78006ac5ecd52e3d0cf72"><li><code class="notion-inline-code">URLSession</code> - 网络请求</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7805782f6d6cd16404a10"><li><code class="notion-inline-code">CFNetwork</code> - Core Foundation 网络</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803aa087c77b61ecb8ab"><li><code class="notion-inline-code">mach_msg_trap</code> - Mach 消息陷阱</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7803f9d5ac983ede64bfd"><li><code class="notion-inline-code">futex_wait</code> - 线程等待</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf78098827ac9cd6c19755f" data-id="2b4e7ea2ebf78098827ac9cd6c19755f"><span><div id="2b4e7ea2ebf78098827ac9cd6c19755f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78098827ac9cd6c19755f" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780f6a7ceca820b1df34d">主线程中出现 I/O 操作应移到后台队列；使用异步 I/O 避免阻塞。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf7802d8647e794ef1feaf4" data-id="2b4e7ea2ebf7802d8647e794ef1feaf4"><span><div id="2b4e7ea2ebf7802d8647e794ef1feaf4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7802d8647e794ef1feaf4" title="🟦 7. Swift / Objective-C 运行时"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 7. Swift / Objective-C 运行时</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf7808f830ed34b0ef2543a">语言层面的性能开销。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780d796e2fbf8eaff409c" data-id="2b4e7ea2ebf780d796e2fbf8eaff409c"><span><div id="2b4e7ea2ebf780d796e2fbf8eaff409c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780d796e2fbf8eaff409c" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78011b6a4ce2ac42ff595"><li><code class="notion-inline-code">swift_release</code> - Swift 对象释放</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78028a503f1a5656d2238"><li><code class="notion-inline-code">swift_retain</code> - Swift 对象引用计数增加</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78033b153c44a0a71b5c3"><li><code class="notion-inline-code">objc_msgSend</code> - Objective-C 消息发送</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780cbb247ca76c72ab6aa"><li><code class="notion-inline-code">objc_retain</code> - ObjC 引用计数增加</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78016bbffcbf0b79b24ee"><li><code class="notion-inline-code">objc_release</code> - ObjC 引用计数减少</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7807abb48f94cc8409b23"><li><code class="notion-inline-code">objc_autoreleasePoolPop</code> - 自动释放池清空</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780ceb8abc212251064cb" data-id="2b4e7ea2ebf780ceb8abc212251064cb"><span><div id="2b4e7ea2ebf780ceb8abc212251064cb" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780ceb8abc212251064cb" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf780769efbc137f355bcba">频繁的 retain/release 说明对象生命周期管理不当；过多的 <code class="notion-inline-code">objc_msgSend</code> 可能是动态派发导致。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2b4e7ea2ebf78010bfc9fdec9fd8fb71" data-id="2b4e7ea2ebf78010bfc9fdec9fd8fb71"><span><div id="2b4e7ea2ebf78010bfc9fdec9fd8fb71" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf78010bfc9fdec9fd8fb71" title="🟦 8. 内存管理"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🟦 8. 内存管理</span></span></h3><div class="notion-text notion-block-2b4e7ea2ebf780cd8315dab96bf9bf05">iOS 的内存分配和释放。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf780a08fc0cad936ff6dc1" data-id="2b4e7ea2ebf780a08fc0cad936ff6dc1"><span><div id="2b4e7ea2ebf780a08fc0cad936ff6dc1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf780a08fc0cad936ff6dc1" title="关键 Slice："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关键 Slice：</span></span></h4><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780289795f6961d81a0ad"><li><code class="notion-inline-code">malloc</code> - 内存分配</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780aca84df1e67aab5bb9"><li><code class="notion-inline-code">free</code> - 内存释放</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780a1a939eed8dce97441"><li><code class="notion-inline-code">zone_malloc</code> - 内存区域分配</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780dd9a56c72002ebc389"><li><code class="notion-inline-code">vm_allocate</code> - 虚拟内存分配</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf78045bc9be950fef6f5d6"><li><code class="notion-inline-code">vm_deallocate</code> - 虚拟内存释放</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7802ba9e2cce564b84b2c"><li><code class="notion-inline-code">dirty_pages</code> - 脏页（内存压力指标）</li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2b4e7ea2ebf7808ea988ecd92bd73775" data-id="2b4e7ea2ebf7808ea988ecd92bd73775"><span><div id="2b4e7ea2ebf7808ea988ecd92bd73775" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7808ea988ecd92bd73775" title="性能优化关注点："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">性能优化关注点：</span></span></h4><div class="notion-text notion-block-2b4e7ea2ebf7808d9816da7a3758fe6f">频繁的 malloc/free 说明内存抖动；监控 dirty_pages 可以预防内存警告。</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2b4e7ea2ebf7804f8bd5c4901b82c9b8" data-id="2b4e7ea2ebf7804f8bd5c4901b82c9b8"><span><div id="2b4e7ea2ebf7804f8bd5c4901b82c9b8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2b4e7ea2ebf7804f8bd5c4901b82c9b8" title="四、总结"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">四、总结</span></span></h2><div class="notion-text notion-block-2b4e7ea2ebf780cd8036c734ed0212f8">通过理解这些常见的 Slice，你可以：</div><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780aaa551c4f4138e0df2"><li><b>快速定位性能瓶颈：</b>在火焰图中识别耗时的关键路径</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780f0b558e73dca806eaf"><li><b>针对性优化：</b>根据 Slice 类型选择合适的优化策略</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf7809fa103e1d34de0a818"><li><b>建立性能基线：</b>对比不同版本的 Slice 耗时，量化优化效果</li></ul><ul class="notion-list notion-list-disc notion-block-2b4e7ea2ebf780eb8f15e8f050ecb43a"><li><b>跨平台理解：</b>掌握 Android 和 iOS 的性能特征，进行双端对比分析</li></ul><div class="notion-text notion-block-2b4e7ea2ebf7800497ebfb30c4cd9cfc">在实际分析中，建议结合具体业务场景，关注那些占比最大、出现最频繁的 Slice，优先优化收益最高的部分。</div><div class="notion-blank notion-block-2b4e7ea2ebf78054a06ce6c451f58d6c"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[通过Delegate&Protocol解决Pod循环应用实战]]></title>
            <link>blog.akinaustin.space/article/202e7ea2-ebf7-8034-a6f5-cebe72d378cd</link>
            <guid>blog.akinaustin.space/article/202e7ea2-ebf7-8034-a6f5-cebe72d378cd</guid>
            <pubDate>Thu, 29 May 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-202e7ea2ebf78034a6f5cebe72d378cd"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-202e7ea2ebf780d99bace6ef5f46d94b"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">这里写文章的前言：
之前曾经在另一篇文章中分享了Protocol与Delegate到底是什么：<a class="notion-page-link 1e5e7ea2-ebf7-8091-a5cc-f63ca1992c15" href="/1e5e7ea2ebf78091a5ccf63ca1992c15"><span class="notion-page-title"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-title-icon notion-page-icon" role="img" aria-label="🗃️">🗃️</span></div><span class="notion-page-title-text">Protocol 与 Delegate</span></span></a><div class="notion-text notion-block-202e7ea2ebf7800e8779ef7f13cf232c">而现在在工作中，恰好遇到了一个Pod循环引用的问题，正好记录下尝试使用Protocol与Delegate进行解耦的流程。</div></div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-202e7ea2ebf7806c9cc0d26da66e9466" data-id="202e7ea2ebf7806c9cc0d26da66e9466"><span><div id="202e7ea2ebf7806c9cc0d26da66e9466" class="notion-header-anchor"></div><a class="notion-hash-link" href="#202e7ea2ebf7806c9cc0d26da66e9466" title="💬 问题背景"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">💬 问题背景</span></span></h2><div class="notion-text notion-block-202e7ea2ebf78048b757d27b079f63ec">因为隐私原因，这里使用代称。</div><div class="notion-text notion-block-202e7ea2ebf78035b530d2ee54d9d1a1">首先让我们看一下今天要设计的两个Pod：</div><ul class="notion-list notion-list-disc notion-block-202e7ea2ebf7803f803fd9ab56c15a20"><li><span class="notion-orange"><b>PodBase</b></span>：部门的基础Pod</li></ul><ul class="notion-list notion-list-disc notion-block-202e7ea2ebf780139f37c4345b2e7769"><li><span class="notion-orange"><b>PodSubTool</b></span>：一个功能相对独立的Pod，用于检测一些场景</li></ul><div class="notion-blank notion-block-202e7ea2ebf780e8b7baefe2082d2457"> </div><div class="notion-text notion-block-202e7ea2ebf78018b4eaf54ee95e4906">现在我遇到的问题如下：</div><ol start="1" class="notion-list notion-list-numbered notion-block-202e7ea2ebf780b3b796f455af8a8e38" style="list-style-type:decimal"><li><span class="notion-orange"><b>PodBase </b></span>中包含了启动各个独立功能Pod的代码，即 <span class="notion-orange"><b>PodBase</b></span> 会调用 <span class="notion-orange"><b>PodSubTool </b></span>的start方法，来开启SubTool的检测功能。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-202e7ea2ebf7804fb273ca5d58effb33" style="list-style-type:decimal"><li>为了提升 <span class="notion-orange"><b>PodSubTool</b></span> 的检测准确率，现在需要使用 <span class="notion-orange"><b>PodBase</b></span> 中的一个工具方法。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-202e7ea2ebf780d58066cb13eeb84049" style="list-style-type:decimal"><li>由于以上两点，达成一个 <span class="notion-orange"><b>PodBase</b></span> 与 <span class="notion-orange"><b>PodSubTool</b></span> 需要循环引用的局面</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-202e7ea2ebf7809c877bcdba1d89a2d3" style="list-style-type:decimal"><li>需要注意的是，这两个Pod，都被同一个主工程 <span class="notion-blue"><b>MainProject</b></span> 所依赖</li></ol><div class="notion-blank notion-block-202e7ea2ebf78009923bf216fccdc707"> </div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-202e7ea2ebf78010a474f8c2c68eb84e" data-id="202e7ea2ebf78010a474f8c2c68eb84e"><span><div id="202e7ea2ebf78010a474f8c2c68eb84e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#202e7ea2ebf78010a474f8c2c68eb84e" title="🔧 解决流程"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🔧 解决流程</span></span></h2><div class="notion-text notion-block-202e7ea2ebf780079d81fbe3a6b8aa98">首先我们先提出一个基本的解决思路：</div><ul class="notion-list notion-list-disc notion-block-202e7ea2ebf78071833beb91ac05c091"><li><span class="notion-orange"><b>PodSubTool</b></span><b> 定义协议并持有 delegate</b>，不依赖 PodBase；</li></ul><ul class="notion-list notion-list-disc notion-block-202e7ea2ebf780a090f8c8db360df3ad"><li><span class="notion-blue"><b>MainProject</b></span><b> 中创建一个桥接对象（Bridge/Adapter）</b>，实现该协议，内部调用 PodBase；</li></ul><ul class="notion-list notion-list-disc notion-block-202e7ea2ebf78073af5dc36dcda5c589"><li>最终在 <span class="notion-blue"><b>MainProject</b></span> 中由 <span class="notion-orange"><b>PodBase</b></span> 创建 <span class="notion-orange"><b>PodSubTool</b></span> 时，<b>顺便设置 delegate</b>。</li></ul><div class="notion-blank notion-block-202e7ea2ebf7807ebc95eac9bff0d6d9"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[iOS中的Touch响应全链路]]></title>
            <link>blog.akinaustin.space/article/1e5e7ea2-ebf7-8057-8f58-dde320b4e760</link>
            <guid>blog.akinaustin.space/article/1e5e7ea2-ebf7-8057-8f58-dde320b4e760</guid>
            <pubDate>Wed, 30 Apr 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-1e5e7ea2ebf780578f58dde320b4e760"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><blockquote class="notion-quote notion-block-1e5e7ea2ebf78146b454e6a5153f040f"><div><span class="notion-gray">Author：akinIan</span></div><div class="notion-text notion-block-1e5e7ea2ebf781bcb241c8df01220b1a"><span class="notion-gray">部分知识源于网络学习，如有错误欢迎指正</span></div></blockquote><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf781788585d0370d90c314" data-id="1e5e7ea2ebf781788585d0370d90c314"><span><div id="1e5e7ea2ebf781788585d0370d90c314" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781788585d0370d90c314" title="一、前言"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">一、前言</span></span></h2><div class="notion-text notion-block-1e5e7ea2ebf781259bbef0912a986b25">尝试学习了iOS响应触摸方式的某些步骤后，发现大部分文章都会选择性的省略某些步骤，阅读后还是会有一知半解的感觉，所以决定自己从头分析一下我们手中的iPhone是如何处理我们的每一次点击、滑动的。</div><div class="notion-blank notion-block-1e5e7ea2ebf7814993eaee5feadeaf68"> </div><div class="notion-blank notion-block-1e5e7ea2ebf781fba08add9446d1a9fd"> </div><hr class="notion-hr notion-block-1e5e7ea2ebf78161973cda0385c7cee1"/><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf7818aa298fb319a84cfac" data-id="1e5e7ea2ebf7818aa298fb319a84cfac"><span><div id="1e5e7ea2ebf7818aa298fb319a84cfac" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7818aa298fb319a84cfac" title="二、交互过程"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">二、交互过程</span></span></h2><h3 class="notion-h notion-h2 notion-blue_background notion-h-indent-1 notion-block-1e5e7ea2ebf78187b72fc73902511b8f" data-id="1e5e7ea2ebf78187b72fc73902511b8f"><span><div id="1e5e7ea2ebf78187b72fc73902511b8f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78187b72fc73902511b8f" title="1. 从触摸屏幕，到系统对触摸事件的封装"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 从触摸屏幕，到系统对触摸事件的封装</span></span></h3><div class="notion-text notion-block-1e5e7ea2ebf78138bbc7dbb576e92774">我们手中的iPhone使用的屏幕，大都是 <span class="notion-orange"><b>“电容触控屏”</b></span>，这样的屏幕由一个覆盖着透明导电材料的感应网格组成，当我们的手指靠近或者触摸屏幕的时候，<span class="notion-yellow"><b>屏幕网格上的电场分布会变化</b></span>，而手机就会通过检测到的电荷变化，来推测出手指的坐标位置。</div><div class="notion-text notion-block-1e5e7ea2ebf78155808cf7d9b90e9db2">采集到触摸信息后，通过 <span class="notion-orange"><b>触摸控制器芯片 </b></span>把采集到的信息，打包成标准输入事件，并且交给驱动、I/O Kit来处理。</div><div class="notion-text notion-block-1e5e7ea2ebf781cfad55debf7c2cf066">而 I/O Kit 会通过与iOS的BackBoard的配合，由BackBoard来进行原始触摸数据的解析，并<span class="notion-yellow"><b>判断他属于哪个App的窗口</b></span>。一旦系统判断发现了这个触摸事件应该交给前台App进行处理，那么就会将这个事件 <span class="notion-teal"><b>转入UIKit层</b></span><span class="notion-red"><b> </b></span>来进行处理！</div><div class="notion-callout notion-gray_background_co notion-block-1e5e7ea2ebf78192af86f785767ee681"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-1e5e7ea2ebf78112adcffde6247c525b"><span class="notion-blue"><b>SpringBoard 与 BackBoard</b></span></div><div class="notion-text notion-block-1e5e7ea2ebf7818bb784de9316363920"><span class="notion-gray">SpringBoard是iOS系统中的一个核心进程，主要负责管理应用程序的启动、切换和显示。它控制着主屏幕（Home Screen）的显示、应用图标的布局、通知中心等UI元素，可以说是用户与iOS系统交互的主要界面管理者。</span></div><div class="notion-text notion-block-1e5e7ea2ebf781109981c70c659a4389"><span class="notion-gray">BackBoard是iOS系统中的另一个重要组件，主要负责处理底层的触摸事件和硬件输入。它作为系统和硬件之间的中间层，接收来自触摸控制器的输入事件，并将其转发给合适的应用程序或系统组件。BackBoard的存在使得触摸事件的处理更加高效和统一。</span></div><div class="notion-text notion-block-1e5e7ea2ebf781678c2ff53b966f20ce"><span class="notion-gray">这两个组件的协同工作，保证了iOS系统流畅的触摸响应体验：BackBoard负责接收和预处理触摸事件，而SpringBoard则负责根据这些事件执行相应的UI操作。</span></div></div></div><div class="notion-blank notion-block-1e5e7ea2ebf78170a738fabd82428c32"> </div><div class="notion-blank notion-block-1e5e7ea2ebf781158fffe27b327abe91"> </div><h3 class="notion-h notion-h2 notion-blue_background notion-h-indent-1 notion-block-1e5e7ea2ebf7819fbe5bc95e98acdedb" data-id="1e5e7ea2ebf7819fbe5bc95e98acdedb"><span><div id="1e5e7ea2ebf7819fbe5bc95e98acdedb" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7819fbe5bc95e98acdedb" title="2. 当事件分配给App，初步进入UIKit层后…"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><span class="notion-blue_background">2. 当事件分配给App，初步进入UIKit层后…</span></span></span></h3><details class="notion-toggle notion-block-1e5e7ea2ebf7811ebc2fc2bb51dffa33"><summary>在这里先介绍两个核心的概念：<span class="notion-blue"><b>什么是UIApplication？什么是Runloop？</b></span></summary><div><div class="notion-callout notion-gray_background_co notion-block-1e5e7ea2ebf781d2a717d6525d52d8d8"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-1e5e7ea2ebf781e59cb6eb3b97301f29"><span class="notion-blue"><b>UIApplication</b></span></div><div class="notion-text notion-block-1e5e7ea2ebf781dd94fccb6e14d7139d"><span class="notion-gray">UIApplication是iOS应用程序的核心对象，每个iOS应用都有且仅有一个UIApplication实例，它在应用启动时由系统自动创建。这个单例对象主要负责：</span></div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78100b0eed7cc734e195f"><li><span class="notion-gray">管理应用程序的生命周期（启动、挂起、恢复、终止等状态）</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781beb195d05da6e0a681"><li><span class="notion-gray">处理系统事件（包括触摸事件、远程通知等）</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78151a174ca169fadbdff"><li><span class="notion-gray">维护一个开放的URL列表（处理应用间通信）</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781629e66eba304b7d25f"><li><span class="notion-gray">协调其他高级app行为（如状态栏的显示、后台任务等）</span></li></ul><div class="notion-text notion-block-1e5e7ea2ebf7811fb889f7973581d2c9"><span class="notion-gray">在事件处理方面，UIApplication扮演着重要角色。当系统将触摸事件传递给应用程序时，事件会首先经过UIApplication对象。UIApplication会将这些事件放入事件队列中，然后在主线程的下一个运行循环中，将它们派发给合适的响应者对象进行处理。</span></div><div class="notion-text notion-block-1e5e7ea2ebf781808b6df7d07bd053f1"><span class="notion-gray">UIApplication的这种设计保证了事件处理的有序性和可控性，同时也为开发者提供了一个统一的接口来管理应用程序的行为。</span></div></div></div><div class="notion-callout notion-gray_background_co notion-block-1e5e7ea2ebf78136a5b0fc8c46681e50"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-1e5e7ea2ebf781d3b063dff3157b7d5e"><span class="notion-blue"><b>Runloop</b></span></div><div class="notion-text notion-block-1e5e7ea2ebf781b8a815e6e079dbe87f"><span class="notion-gray">Runloop（运行循环）是iOS中一个核心的事件处理机制，它维护了一个持续运行的循环，用于处理输入事件、定时器和其他各种任务。其主要职责包括：</span></div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78155a77ad6df7fa7fe49"><li><span class="notion-gray">接收和处理各种事件（用户输入、系统事件等）</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781408d45c986eec30b63"><li><span class="notion-gray">调度定时器的触发</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781d4b6f7ece03041e5d9"><li><span class="notion-gray">处理UI更新</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781a0943bee5f3f71e305"><li><span class="notion-gray">协调线程间的通信</span></li></ul><div class="notion-text notion-block-1e5e7ea2ebf7814d9d6ac01f7a1c10ac"><span class="notion-gray">每个线程都可以有自己的Runloop，但只有主线程的Runloop是默认创建并运行的。其他线程的Runloop需要手动创建和运行。</span></div><div class="notion-text notion-block-1e5e7ea2ebf78177b9dbfb7b2c9adc0c"><span class="notion-gray">在事件处理的过程中，Runloop扮演着重要角色：它会不断地从事件队列中取出事件，将其分发给相应的处理者。当没有事件需要处理时，Runloop会使线程进入休眠状态，从而节省系统资源。一旦有新的事件到来，Runloop就会被唤醒，继续处理新的事件。</span></div><div class="notion-text notion-block-1e5e7ea2ebf78104a948d60ba3b88605"><span class="notion-gray">这种机制确保了应用程序能够持续响应用户输入，同时在没有任务时不会占用过多系统资源。对于触摸事件的处理，Runloop确保了事件能够按照正确的顺序被处理，并维护了整个事件响应链的稳定运行。</span></div></div></div></div></details><div class="notion-text notion-block-1e5e7ea2ebf781f3ac72c2995885ca9b">当前App的主线程runloop是基于  <code class="notion-inline-code">CFRunLoop</code> 的，而UIKit会在 <code class="notion-inline-code">UIApplication</code> 主循环中监听是否有新的事件到来 ，当一个触摸的事件到达这个 <code class="notion-inline-code">UIApplication</code> 的时候，<span class="notion-yellow"><b>UIKit会将其封装为UITouch与UIEvent</b></span>：</div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781f9a679c1ab35ba40b8"><li><span class="notion-blue"><b>UIEvent</b></span>：表示一整个用户交互事件（包括多个手指）</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781c7b536c079784ee476"><li><span class="notion-blue"><b>UITouch</b></span>：表示单个手指的状态（起点、位置、阶段）</li></ul><div class="notion-text notion-block-1e5e7ea2ebf78150a589fc54d9fd1f14">一个UIEvent里可能包含了多个UITouch，系统先创建UITouch，然后把这些touches封装进了UIEvent，再交给App</div><div class="notion-text notion-block-1e5e7ea2ebf781818ac4d88b54a4b075">等当前的 <code class="notion-inline-code">UIEvent</code> 封装好后，<code class="notion-inline-code">UIApplication</code> 会把这个Event分发给当前的 <code class="notion-inline-code">UIWindow</code>，这个步骤就是我们常说的sendEvent：</div><div class="notion-callout notion-gray_background_co notion-block-1e5e7ea2ebf781469dd8ec886277b193"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-1e5e7ea2ebf781eaaa69d6f8662e1cb7"><span class="notion-blue"><b>UIWindow</b></span></div><div class="notion-text notion-block-1e5e7ea2ebf78146a26dcb80d0c8351f"><span class="notion-gray">UIWindow是iOS应用程序中视图层次结构的最顶层容器，继承自UIView。每个iOS应用程序至少需要一个UIWindow实例（通常称为主窗口）来展示内容。UIWindow在视图层级中扮演着关键角色：</span></div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78177a2ced8d35f887e69"><li><span class="notion-gray">作为视图层次结构的根视图，所有的UI元素最终都必须添加到UIWindow上才能显示</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78175a448cdec3925fbae"><li><span class="notion-gray">负责协调视图之间的层级关系，管理视图控制器的切换</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781238763cc807936a7fc"><li><span class="notion-gray">在事件响应链中扮演重要角色，接收来自UIApplication的事件并将其分发给合适的视图</span></li></ul><div class="notion-text notion-block-1e5e7ea2ebf78198bcfefdd0501e1ecc"><span class="notion-gray">在UIKit架构中，UIWindow与UIApplication的关系是这样的：</span></div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78109ae05c0fa452d97ff"><li><span class="notion-gray">UIApplication持有一个windows数组，包含了应用程序的所有窗口</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7817eb14ac131710fca90"><li><span class="notion-gray">其中keyWindow（现在更推荐使用windowScene.keyWindow）是当前接收键盘和其他非触摸事件的主窗口</span></li></ul><div class="notion-text notion-block-1e5e7ea2ebf7816ba33bf849eeedf2fa"><span class="notion-gray">当一个事件通过sendEvent到达UIWindow后，UIWindow会通过hitTest:withEvent:方法来确定第一响应者，这个响应者通常是用户触摸点所在的最上层的视图。</span></div></div></div><div class="notion-callout notion-gray_background_co notion-block-1e5e7ea2ebf781169444f399bc8ad5f3"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-1e5e7ea2ebf781e2a8b5d0e18e3761ef"><span class="notion-blue"><b>sendEvent</b></span></div><div class="notion-text notion-block-1e5e7ea2ebf78177be3cda7368d45698"><span class="notion-gray">sendEvent 是 </span><span class="notion-red"><code class="notion-inline-code">UIApplication</code></span><span class="notion-gray">和</span><span class="notion-red"><code class="notion-inline-code">UIWindow</code></span><span class="notion-teal">都实现</span><span class="notion-gray">的一个方法，它的完整声明是：</span></div><div class="notion-text notion-block-1e5e7ea2ebf7813c977eff7784dbd007"><span class="notion-gray">在UIApplication中，这个方法负责将接收到的事件分发给合适的UIWindow。而在UIWindow中，这个方法则负责将事件分发给具体的视图。</span></div><div class="notion-text notion-block-1e5e7ea2ebf781d8ae8efcaed488e9fd"><span class="notion-gray">事件传递的基本流程是：</span></div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781a8a09fd4ed41499438"><li><span class="notion-gray">1. UIApplication接收到系统传来的事件后，调用sendEvent:将事件传递给合适的UIWindow</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7814caa70cf460dd3a1cc"><li><span class="notion-gray">2. UIWindow通过自己的sendEvent:方法，结合hitTest:withEvent:的结果，将事件分发给具体的视图</span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781cb888decff50018f78"><li><span class="notion-gray">3. 目标视图接收到事件后，开始在响应链中进行处理</span></li></ul><div class="notion-text notion-block-1e5e7ea2ebf781c2ad14c0ef216b917f"><span class="notion-gray">值得注意的是，这个方法通常不需要我们自己去调用或重写，它是UIKit框架内部用于事件分发的重要机制。</span></div></div></div><div class="notion-blank notion-block-1e5e7ea2ebf78123bb25d4ed89b0c291"> </div><div class="notion-blank notion-block-1e5e7ea2ebf7813e8752d74d0c0ac314"> </div><h3 class="notion-h notion-h2 notion-blue_background notion-h-indent-1 notion-block-1e5e7ea2ebf78157a907c0f626b9a55d" data-id="1e5e7ea2ebf78157a907c0f626b9a55d"><span><div id="1e5e7ea2ebf78157a907c0f626b9a55d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78157a907c0f626b9a55d" title="3. UIWindow是如何处理触摸event的？"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">3. UIWindow是如何处理触摸event的？</span></span></h3><div class="notion-text notion-block-1e5e7ea2ebf781d1825fd47dc234e8b4">在上一部分，UIApplication通过sendEvent，把事件分发给了当前活跃中的UIWindow：</div><div class="notion-blank notion-block-1e5e7ea2ebf7816cadadd77bc7d0460f"> </div><div class="notion-text notion-block-1e5e7ea2ebf7815d81ade7a36623d73f">从上边UIWindow的介绍，我们得知了 <code class="notion-inline-code">UIWindow</code> 中也有 <code class="notion-inline-code">sendEvent:</code> 方法，那么这里的sendEvent是在进行什么操作呢，首先我们先从一段伪代码引入这个问题</div><div class="notion-text notion-block-1e5e7ea2ebf781518192d9d7d4775745">这里我们可以看到，首先会从event中取出所有的touch，在 <code class="notion-inline-code">UITouchPhaseBegan</code> 的时候，会先触发一次 <code class="notion-inline-code">hitTest:withEvent:</code> ，找出哪个view最适合处理本次触摸，找到后将其设置为 <code class="notion-inline-code">touch.view</code> ，并且接下来的Moved/Ended/Canceled都发送给这个View。</div><div class="notion-blank notion-block-1e5e7ea2ebf781a5a887e1bcf161a9de"> </div><div class="notion-text notion-block-1e5e7ea2ebf7811e80d8f8e815db31f3">在这里，首先我们回来介绍一下 <code class="notion-inline-code">hitTest:withEvent:</code> </div><div class="notion-text notion-block-1e5e7ea2ebf781a6808be0568dee9982">这个方法是定义在UIView中的，并且所有的UIView子类<span class="notion-gray">(UIWindow也是UIView的子类！)</span> 都会继承这个方法。每一个View在被调用这个方法的时候，都会执行以下几个步骤：</div><div class="notion-text notion-block-1e5e7ea2ebf781f2bf73d2cea0de93b6">可以看出，整个hitTest就是一个从UIWindow开始，<span class="notion-teal"><b>递归遍历其所有子View和子View的子View </b></span>的过程。</div><div class="notion-blank notion-block-1e5e7ea2ebf7818c9f4ffcea8cd0e8d6"> </div><div class="notion-text notion-block-1e5e7ea2ebf7811bba3fe3858a798a63">在hitTest的过程中，系统在寻找 “最合适的响应者” 的时候，优先考虑以下这几个条件：</div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78165b43dc90a6dc728ea"><li>可交互：<span class="notion-blue"><code class="notion-inline-code">userInteractionEnabled == YES</code></span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7812c85bfc677899f52d9"><li>可见：<span class="notion-blue"><code class="notion-inline-code">hidden == NO</code></span>，<span class="notion-blue"><code class="notion-inline-code">alpha &gt; 0.01</code></span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7819890d4cd7dcde475ae"><li>点击在范围内：<span class="notion-blue"><code class="notion-inline-code">[self pointInside:point withEvent:event] == YES</code></span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7812ab73df52c342eb03f"><li>Z轴最上：<span class="notion-blue"><code class="notion-inline-code">// 先检查最上层 subview（数组倒序）</code></span></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78113a904df29cffbbe73"><li>最深处（递归）：<span class="notion-blue"><code class="notion-inline-code">// 会一直往下递归查找 subview 中最深的匹配者</code></span></li></ul><div class="notion-blank notion-block-1e5e7ea2ebf7818983f4ea5edeb5e1c1"> </div><div class="notion-blank notion-block-1e5e7ea2ebf78185bf54c14ab21e3940"> </div><div class="notion-blank notion-block-1e5e7ea2ebf781019ff4db50771d5376"> </div><h3 class="notion-h notion-h2 notion-blue_background notion-h-indent-1 notion-block-1e5e7ea2ebf7810fb2bdc59f5a0079e6" data-id="1e5e7ea2ebf7810fb2bdc59f5a0079e6"><span><div id="1e5e7ea2ebf7810fb2bdc59f5a0079e6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7810fb2bdc59f5a0079e6" title="4. 找到了最适合响应的View后，View会如何处理这个响应事件"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">4. 找到了最适合响应的View后，View会如何处理这个响应事件</span></span></h3><div class="notion-text notion-block-1e5e7ea2ebf7817d90afc67ca89e7849">在通过hitTest找到了这个View后：</div><ol start="1" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf781deacb5f141bd6b456b" style="list-style-type:decimal"><li>系统将其赋值给touch.view</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf78191a792d8bef4c1a935" style="list-style-type:decimal"><li>首先判断这个view有没有<code class="notion-inline-code">UIGestureRecognizer</code>：</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf78153bad8e9da3e81db7c" style="list-style-type:decimal"><li>如果这个View有<code class="notion-inline-code">UIGestureRecognizer</code>，此时有一个关键的配置是 cancelsTouchesInView（默认为YES）：以一个<span class="notion-red"><code class="notion-inline-code">UITapGestureRecognizer</code></span><code class="notion-inline-code"> *tap = *** </code>为例</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf781d5aaddf37a8180f46f" style="list-style-type:decimal"><li>如果<span class="notion-teal"><b>tap.cancelsTouchesInView = YES</b></span></li><ol class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf781d5aaddf37a8180f46f" style="list-style-type:lower-alpha"><li>用户点击后，先执行 <code class="notion-inline-code">touchesBegan:</code></li><li>GestureRecognizer 识别成功的时候 <span class="notion-gray"><b>(GestureRecognizer识别失败则正常的进行touches方法 )</b></span></li><li>UIKit 会发送 <code class="notion-inline-code">touchesCancelled:</code> 给 View</li><li>View就不再接收后续事件了</li></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf78116b9dedae0cc6f8e34" style="list-style-type:decimal"><li>如果<span class="notion-teal"><b>tap.cancelsTouchesInView = NO</b></span></li><ol class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf78116b9dedae0cc6f8e34" style="list-style-type:lower-alpha"><li>用户点击后，先执行 <code class="notion-inline-code">touchesBegan:</code></li><li>即使GestureRecognizer 识别成功，View依旧可以接收完整的<b>touchesBegan、touchesMoved、touchesEnded</b>；</li><li>双方可以并行处理</li></ol></ol><div class="notion-blank notion-block-1e5e7ea2ebf781a5bfbecaf10955e1ee"> </div><div class="notion-text notion-block-1e5e7ea2ebf7815c82e9f94d09012015">下边我们再回来介绍一下上边提到的UIGestureRecognizer：</div><div class="notion-text notion-block-1e5e7ea2ebf7812582d4d8ba3bb5e3a0">首先，我们要先明确这个UIGestureRecognizer 是由用户添加而非系统自动添加的，开发者可以通过手动添加这些机制，更加高级、结构化的处理touch事件，比如：</div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781179c45f91e13d0c8ae"><li>单击、双击（<code class="notion-inline-code">UITapGestureRecognizer</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781fdb532d75a7d5cef93"><li>长按（<code class="notion-inline-code">UILongPressGestureRecognizer</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781c78c07c07fd77ffdb0"><li>拖动（<code class="notion-inline-code">UIPanGestureRecognizer</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781759e2ff15f477275a4"><li>缩放（<code class="notion-inline-code">UIPinchGestureRecognizer</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7811a9da4da2cf656f719"><li>旋转（<code class="notion-inline-code">UIRotationGestureRecognizer</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7816ea43fd765ccd1d8a9"><li>轻扫（<code class="notion-inline-code">UISwipeGestureRecognizer</code>）</li></ul><div class="notion-blank notion-block-1e5e7ea2ebf7815c87d9f5ca116fa61d"> </div><div class="notion-text notion-block-1e5e7ea2ebf7817e99aaea287f9542c1">在代码中，我们首先要创建并初始化手势识别器，并将其添加到View上：</div><div class="notion-text notion-block-1e5e7ea2ebf781ffb366e7cb545412c9">此时，self.view接收到的tap事件就会由这个handleTap来处理了</div><div class="notion-blank notion-block-1e5e7ea2ebf78109ab5fe35e15ed6d03"> </div><div class="notion-text notion-block-1e5e7ea2ebf78190b2edc4606032dbb9">除了使用UIGestureRecognizer之外，开发者也可以使用重写UIView方法的方式来进行自定义响应逻辑：</div><table class="notion-simple-table notion-block-1e5e7ea2ebf781f39b11fb325c41670d"><tbody><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf78190a706fb0940f3f4fa"><td class="" style="width:244px"><div class="notion-simple-table-cell">场景</div></td><td class="" style="width:465px"><div class="notion-simple-table-cell">推荐方法</div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf78198aef4db28566ee548"><td class="" style="width:244px"><div class="notion-simple-table-cell">简单手势（点击、长按、滑动）</div></td><td class="" style="width:465px"><div class="notion-simple-table-cell">使用 <code class="notion-inline-code">UIGestureRecognizer</code>，结构清晰、解耦</div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf78163a637e3b3a64a3ba6"><td class="" style="width:244px"><div class="notion-simple-table-cell">更复杂逻辑、手势状态控制、响应区域自定义</div></td><td class="" style="width:465px"><div class="notion-simple-table-cell">使用 <code class="notion-inline-code">touchesBegan:</code> 系列方法手动处理</div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf781d2a874e570585aac56"><td class="" style="width:244px"><div class="notion-simple-table-cell">想做一些自定义响应（如事件穿透、模拟按钮）</div></td><td class="" style="width:465px"><div class="notion-simple-table-cell">重写 <code class="notion-inline-code">hitTest:</code> 或 <code class="notion-inline-code">pointInside:</code> 并配合 touches 系列方法</div></td></tr></tbody></table><div class="notion-blank notion-block-1e5e7ea2ebf781c19a7ddd2582209626"> </div><div class="notion-blank notion-block-1e5e7ea2ebf781e0b479cb6c418d36bf"> </div><hr class="notion-hr notion-block-1e5e7ea2ebf781aca4cff914b12facf2"/><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf78122b161cfe6ccf675e4" data-id="1e5e7ea2ebf78122b161cfe6ccf675e4"><span><div id="1e5e7ea2ebf78122b161cfe6ccf675e4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78122b161cfe6ccf675e4" title="三、事件处理过程 (技术角度)"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">三、事件处理过程 (技术角度)</span></span></h2><div class="notion-text notion-block-1e5e7ea2ebf781c2bf5afbaca9b3b1a4">那么经过了上边的第二部分，我们就已经梳理好了点击事件被手机响应的整个流程，那么现在我们再从技术视角总结一下这个过程，来形成更好的理解：</div><div class="notion-blank notion-block-1e5e7ea2ebf781b7892fd1111d48e996"> </div><h3 class="notion-h notion-h2 notion-blue notion-h-indent-1 notion-block-1e5e7ea2ebf781b3a1bfff3b20c475fa" data-id="1e5e7ea2ebf781b3a1bfff3b20c475fa"><span><div id="1e5e7ea2ebf781b3a1bfff3b20c475fa" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781b3a1bfff3b20c475fa" title="UIApplication层"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">UIApplication层</span></span></h3><div class="notion-text notion-block-1e5e7ea2ebf7815db5cac3d5008f350e">触摸到达UIApplication，封装为UIEvent 与 UITouch：</div><div class="notion-text notion-block-1e5e7ea2ebf781ae9802c717f833dd57">最终事件通过 [UIApplication sendEvent:] 送入App的主事件循环</div><div class="notion-blank notion-block-1e5e7ea2ebf781ed8d77ebf52b11cca6"> </div><h3 class="notion-h notion-h2 notion-blue notion-h-indent-1 notion-block-1e5e7ea2ebf781498a43c2f2ea4ff759" data-id="1e5e7ea2ebf781498a43c2f2ea4ff759"><span><div id="1e5e7ea2ebf781498a43c2f2ea4ff759" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781498a43c2f2ea4ff759" title="UIWindow &amp; UIView hitTest层"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">UIWindow &amp; UIView hitTest层</span></span></h3><div class="notion-text notion-block-1e5e7ea2ebf781c1a097c5c0a3893f90">UIWindow开始调用自己的sendEvent，来分发事件(再次提醒UIWindow是UIView的子类)</div><div class="notion-blank notion-block-1e5e7ea2ebf781b0b16edb3f6e259f9c"> </div><div class="notion-text notion-block-1e5e7ea2ebf7814daa30c468a7a56ade">并且逐步递归的进行hitTest：</div><div class="notion-text notion-block-1e5e7ea2ebf78179af31dbf5990487a3"><code class="notion-inline-code">UIWindow.hitTest → UIView.hitTest（递归）→ 返回最深可响应 View</code></div><div class="notion-blank notion-block-1e5e7ea2ebf78156b5ade3039f14f21d"> </div><h3 class="notion-h notion-h2 notion-blue notion-h-indent-1 notion-block-1e5e7ea2ebf781e99ffcfc153280ed52" data-id="1e5e7ea2ebf781e99ffcfc153280ed52"><span><div id="1e5e7ea2ebf781e99ffcfc153280ed52" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781e99ffcfc153280ed52" title="UIView 响应层"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">UIView 响应层</span></span></h3><div class="notion-text notion-block-1e5e7ea2ebf7814aab4ec1fc12899c3b">找到了targetView后，并行或独立的触发Gesture和Touches方法</div><div class="notion-text notion-block-1e5e7ea2ebf7813795cbe9ca7459b8fe">(取决于gestureRecognizer.cancelsTouchesInView)</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1e5e7ea2ebf78195afeedd5b3585fa8f" data-id="1e5e7ea2ebf78195afeedd5b3585fa8f"><span><div id="1e5e7ea2ebf78195afeedd5b3585fa8f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78195afeedd5b3585fa8f" title="1. GestureRecognizer"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. GestureRecognizer</span></span></h4><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781079ba5df1279b013da"><li>系统调用内部私有方法<code class="notion-inline-code">_receiveTouch:</code> (等价于 <code class="notion-inline-code">touchesBegan：</code> )</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781f08b69c18df5007064"><li>每个UIGestureRecognizer都注册自己的状态机（长按、滑动、双击等）</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781b79459d9704d95bf13"><li>若识别成功，进入 <code class="notion-inline-code">.recognized</code> 状态，并调用这个Recognizer的 <code class="notion-inline-code">target-action</code></li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781199cf0c32d4749ccc0"><li>此时，若<code class="notion-inline-code">gestureRecognizer.cancelsTouchesInView = YES</code>，则后续的<code class="notion-inline-code">touchesMoved</code>、<code class="notion-inline-code">touchesEnded</code>会被取消。否则照常执行。</li></ul><div class="notion-blank notion-block-1e5e7ea2ebf781bfa0a3f03254dea3d4"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1e5e7ea2ebf78191a566eb330369ed77" data-id="1e5e7ea2ebf78191a566eb330369ed77"><span><div id="1e5e7ea2ebf78191a566eb330369ed77" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78191a566eb330369ed77" title="2. View的touch响应"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. View的touch响应</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf7816eb8b9f58aace7cc20">如果这个view没有注册GestureRecognizer，那么在第一步<code class="notion-inline-code">touchesBegan:</code> 后，自然也不会有gesture识别成功，则会继续进入touchesMoved与touchEnded函数：</div><div class="notion-text notion-block-1e5e7ea2ebf781c28bd5c903a7e1fcdb">view可以通过重写这些方法来自定义响应：</div><div class="notion-blank notion-block-1e5e7ea2ebf78138b4cbd43292e8992e"> </div><h3 class="notion-h notion-h2 notion-blue notion-h-indent-1 notion-block-1e5e7ea2ebf781aa9943ce0507a7962c" data-id="1e5e7ea2ebf781aa9943ce0507a7962c"><span><div id="1e5e7ea2ebf781aa9943ce0507a7962c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781aa9943ce0507a7962c" title="汇总"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">汇总</span></span></h3><table class="notion-simple-table notion-block-1e5e7ea2ebf7811491c3f34352aab3dd"><tbody><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf781c4b71fce159b8501dd"><td class="" style="width:120px"><div class="notion-simple-table-cell">步骤</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">所在类</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">方法</div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf78184b635ebfe926491ae"><td class="" style="width:120px"><div class="notion-simple-table-cell">1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">UIApplication</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sendEvent:</code></div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf781f1b295d1190599a248"><td class="" style="width:120px"><div class="notion-simple-table-cell">2</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">UIWindow</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sendEvent:</code></div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf781a0a526da551cff9858"><td class="" style="width:120px"><div class="notion-simple-table-cell">3</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">UIView（递归）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">hitTest:withEvent:</code></div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf781849859c262dbe6a785"><td class="" style="width:120px"><div class="notion-simple-table-cell">4</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">UIView（或其子类）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">pointInside:withEvent:</code></div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf781c18111e4ea4a07f975"><td class="" style="width:120px"><div class="notion-simple-table-cell">5</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">UIGestureRecognizer</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">_receiveTouch:</code>（监听识别）</div></td></tr><tr class="notion-simple-table-row notion-block-1e5e7ea2ebf78171ae39cb188bfd1cc3"><td class="" style="width:120px"><div class="notion-simple-table-cell">6</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">UIView（或其子类）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">touchesBegan:</code> 等</div></td></tr></tbody></table><div class="notion-blank notion-block-1e5e7ea2ebf7819c8ffeee20aab2a2df"> </div><div class="notion-blank notion-block-1e5e7ea2ebf7812094edefe75eaee6ca"> </div><div class="notion-blank notion-block-1e5e7ea2ebf7813e901dc1f1351bbe8a"> </div><hr class="notion-hr notion-block-1e5e7ea2ebf781b1a10ceec6f24571e7"/><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf78161969edcf391bcf2e7" data-id="1e5e7ea2ebf78161969edcf391bcf2e7"><span><div id="1e5e7ea2ebf78161969edcf391bcf2e7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78161969edcf391bcf2e7" title="四、结尾"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">四、结尾</span></span></h2><div class="notion-text notion-block-1e5e7ea2ebf781eb981ce9517e15de18">那么到这里，完整的touch链路就被完全梳理完成了。如有错误欢迎勘误～</div><div class="notion-blank notion-block-1e5e7ea2ebf781d79e15e997f789ed85"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[OC中的GCD (Grand Central Dispatch)]]></title>
            <link>blog.akinaustin.space/article/1e5e7ea2-ebf7-8097-97e5-ea597707a111</link>
            <guid>blog.akinaustin.space/article/1e5e7ea2-ebf7-8097-97e5-ea597707a111</guid>
            <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-1e5e7ea2ebf7809797e5ea597707a111"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-1e5e7ea2ebf78111a472ee368f53124e" data-id="1e5e7ea2ebf78111a472ee368f53124e"><span><div id="1e5e7ea2ebf78111a472ee368f53124e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78111a472ee368f53124e" title="什么是GCD（Grand Central Dispatch）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">什么是GCD（Grand Central Dispatch）</span></span></h2><div class="notion-text notion-block-1e5e7ea2ebf781aa8fbcfb7d13cca9f1">GCD是Apple开发的一个多核编程的解决方案，它让开发者可以更加方便地进行多线程编程。GCD的核心是dispatch queue（调度队列）。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1e5e7ea2ebf781c99214e0ec72a2b250" data-id="1e5e7ea2ebf781c99214e0ec72a2b250"><span><div id="1e5e7ea2ebf781c99214e0ec72a2b250" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781c99214e0ec72a2b250" title="主要队列类型"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">主要队列类型</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1e5e7ea2ebf781e48f9fdd907c873c8c" data-id="1e5e7ea2ebf781e48f9fdd907c873c8c"><span><div id="1e5e7ea2ebf781e48f9fdd907c873c8c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781e48f9fdd907c873c8c" title="1. 串行队列（Serial Dispatch Queue）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 串行队列（Serial Dispatch Queue）</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf78177ac21df0824401baf">串行队列按照先进先出（FIFO）的顺序执行任务，同一时间只能执行一个任务。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1e5e7ea2ebf781dca4b2fb3d04d5783d" data-id="1e5e7ea2ebf781dca4b2fb3d04d5783d"><span><div id="1e5e7ea2ebf781dca4b2fb3d04d5783d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781dca4b2fb3d04d5783d" title="2. 并发队列（Concurrent Dispatch Queue）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 并发队列（Concurrent Dispatch Queue）</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf781a0bf6ee551ee0a04b6">并发队列可以同时执行多个任务，但任务完成的顺序是不确定的。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1e5e7ea2ebf781239443d30093e04535" data-id="1e5e7ea2ebf781239443d30093e04535"><span><div id="1e5e7ea2ebf781239443d30093e04535" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781239443d30093e04535" title="3. 主队列（Main Queue）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">3. 主队列（Main Queue）</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf781f89a16e80e74d0b264">主队列是一个特殊的串行队列，专门用于在主线程上执行任务，通常用于UI更新。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1e5e7ea2ebf78160b664d9670001bc88" data-id="1e5e7ea2ebf78160b664d9670001bc88"><span><div id="1e5e7ea2ebf78160b664d9670001bc88" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78160b664d9670001bc88" title="队列使用方式"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">队列使用方式</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1e5e7ea2ebf781c0962ed4e978c7a20b" data-id="1e5e7ea2ebf781c0962ed4e978c7a20b"><span><div id="1e5e7ea2ebf781c0962ed4e978c7a20b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781c0962ed4e978c7a20b" title="1. 同步派发（Sync）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1. 同步派发（Sync）</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf78183b283ce37a9dc0fb2">同步派发会阻塞当前线程，直到任务执行完成。</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1e5e7ea2ebf78153b04cedd5a224f9a0" data-id="1e5e7ea2ebf78153b04cedd5a224f9a0"><span><div id="1e5e7ea2ebf78153b04cedd5a224f9a0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf78153b04cedd5a224f9a0" title="2. 异步派发（Async）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 异步派发（Async）</span></span></h4><div class="notion-text notion-block-1e5e7ea2ebf781e3bb00d640eae2d5b8">异步派发不会阻塞当前线程，任务会在后台执行。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1e5e7ea2ebf7818bac41ce6ad347c6ac" data-id="1e5e7ea2ebf7818bac41ce6ad347c6ac"><span><div id="1e5e7ea2ebf7818bac41ce6ad347c6ac" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7818bac41ce6ad347c6ac" title="常见使用场景"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">常见使用场景</span></span></h3><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781959636c7525f67ac63"><li>网络请求：使用异步队列处理网络操作，完成后在主队列更新UI</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781ac9dacfb2085db38cf"><li>图片处理：在后台队列处理图片，避免阻塞主线程</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781f58bb9d57744db313c"><li>文件操作：使用后台队列进行文件读写操作</li></ul><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1e5e7ea2ebf7813e8832fb12554b1ae5" data-id="1e5e7ea2ebf7813e8832fb12554b1ae5"><span><div id="1e5e7ea2ebf7813e8832fb12554b1ae5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf7813e8832fb12554b1ae5" title="注意事项"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">注意事项</span></span></h3><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781ecaf6cf1a7e4e846e0"><li>避免在主队列中执行耗时操作</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf78160848ad443f7fbaf6b"><li>警惕死锁情况，例如在主队列中同步派发到主队列</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781649eecee10c4dc5781"><li>合理使用串行队列和并发队列，根据实际需求选择</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781d29720fe06b0445c41"><li>注意内存管理，防止循环引用</li></ul><div class="notion-text notion-block-1e5e7ea2ebf7816cb77ff36d8b27c526">理解和正确使用GCD队列对于开发高性能的iOS应用至关重要。合理利用不同类型的队列和派发方式，可以显著提升应用的响应性和用户体验。</div><div class="notion-blank notion-block-1e5e7ea2ebf781088adec00409321eed"> </div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1e5e7ea2ebf781c5bb2bd847dd344c4a" data-id="1e5e7ea2ebf781c5bb2bd847dd344c4a"><span><div id="1e5e7ea2ebf781c5bb2bd847dd344c4a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1e5e7ea2ebf781c5bb2bd847dd344c4a" title="例子"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">例子</span></span></h3><div class="notion-text notion-block-1e5e7ea2ebf781caa1b4f4509125085b">这段代码中主要使用了以下几种dispatch方式：</div><ol start="1" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf781588987d8cae28b6f0c" style="list-style-type:decimal"><li>使用全局并发队列进行异步操作：
<code class="notion-inline-code">dispatch_async(dispatch_get_global_queue(0, 0), ^{ ... })</code>
用于处理热图模型数据，避免阻塞主线程</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1e5e7ea2ebf78184bbcbe071ee33f9cc" style="list-style-type:decimal"><li>延迟派发到主队列：
<code class="notion-inline-code">dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ ... })</code>
用于处理图片上传中的情况，延迟5秒后在主队列执行上报操作</li></ol><div class="notion-text notion-block-1e5e7ea2ebf7817797cae0d651927502">这种使用方式符合GCD的最佳实践：</div><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781219756d90e26539279"><li>将耗时操作放在后台队列处理</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf781bd88fac7fb77b15ba7"><li>UI相关的操作（如更新状态）放在主队列执行</li></ul><ul class="notion-list notion-list-disc notion-block-1e5e7ea2ebf7817f90f8fa375b9f5cea"><li>合理使用异步操作来提高应用性能和响应性</li></ul></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>