# 老司机 iOS 周报 #340 | 2025-06-30

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/weekly-header/340.jpg?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 文章

### 🌟 🐢 [btrace 3.0 对外开源：重磅新增 iOS 支持！免插桩原理大揭秘！](https://github.com/bytedance/btrace/blob/master/INTRODUCTION.zh-CN.MD)

[@JonyFang](https://github.com/JonyFang): btrace 是字节开源的一款高性能 Android/iOS 端性能追踪（Tracing）工具，基于 Perfetto 进行数据展示。它能够详细记录方法的调用过程，精准分析耗时，并归因性能瓶颈，兼具高采样精度和低性能损耗。与 Apple 的 Time Profiler 等传统工具相比，btrace 更加灵活、可自定义，并支持系统方法追踪、有丰富的数据归因和可视化能力，能帮助开发者深入理解和优化 App 性能。

btrace 3.0 相比 2.0 的优化（iOS 视角）：

1. 采集方案升级。
3.0 由单一编译期插桩，升级为“同步抓栈 + 异步抓栈”的混合采样方案。同步抓栈通过 hook 高频系统方法和关键节点，实时采集 Trace 数据；异步抓栈则通过独立采样线程定时回溯线程调用栈，保证采集的时间连续性。相比 2.0，3.0 大幅降低了接入和维护成本，采集更全面、对系统方法也支持更好。

2. 数据存储与压缩优化。
3.0 针对 Trace 数据量大、存储压力大等问题，设计了高效的调用栈去重与压缩结构。通过空间相似性（调用栈公共前缀合并）、时间相似性（连续相同栈合并）等手段，进一步减少内存和磁盘占用，提升了大体量数据下的可用性。

3. 多线程与性能再提升。
3.0 优化了多线程数据写入的并发安全性与性能，采用 CAS 等无锁 / 低锁技术，兼顾高性能与数据一致性，在复杂多线程场景下依然保持低开销。

4. 死锁规避与线程采样精细化。
异步采样时规避了 Time Profiler 可能导致的死锁风险，通过黑名单和信号安全 API 控制，提升了工具的稳定性。同时，仅采集活跃线程，有效降低了对 App 性能的影响。

5. 丰富的性能归因与可视化。
除了基本的方法调用追踪，3.0 进一步支持 CPU 时间、对象分配、缺页 / 上下文切换、线程阻塞等多维度的耗时归因，配合 Perfetto 可视化，帮助开发者一站式定位性能瓶颈。

6. 易用性和生态提升。
3.0 极大简化了接入流程，无需业务侧代码大改，无侵入式支持线上场景，支持性能自动诊断和多端（Android/iOS/ 鸿蒙 /Web）扩展，生态愈发完善。

整体来看，btrace 3.0 对 iOS 开发者而言，是一款集高性能、易用性、灵活性于一体的专业 Trace 工具。相比 2.0，3.0 大幅优化了采集方式、性能、安全性和数据分析能力，适合需要深入性能调优、线上问题定位和日常性能治理使用，推荐纳入工程实践！


### 🐕 [避免在 Swift 中使用 `self.`](https://juejin.cn/post/7508668930896412722)

[@AidenRao](https://weibo.com/AidenRao)：这篇文章探讨了在 Swift 开发中避免不必要的 `self.` 前缀使用，利用编译器检查减少循环引用风险。它基于 Swift 5.3（SE-0269）和 5.8（SE-0365）的演进，在闭包中省略 `self.` 能让编译器强制捕获语义（如使用 `[weak self]`），从而暴露潜在内存泄漏问题。

### 🐕 [Why I ’ ve Filed Over 1,000 Apple Feedbacks — And Why You Should Too](https://www.linkedin.com/pulse/why-ive-filed-over-1000-apple-feedbacks-you-should-too-eric-dorphy-qfe8c/)

[@阿权](https://github.com/bqlin)：文章分享了作者关于 Apple Feedback 的心得体会与收益：

1. 反馈的价值：
   1. 作者自 2014 年起提交超 1000 条反馈，推动漏洞修复、文档更新及新功能开发（如 HealthKit、MetricKit 等框架的改进）。
   2. 对开发者而言，可以理清技术思路、记录测试用例，形成可复用的技术文档；提升沟通能力，强化对平台的理解，甚至在撰写反馈过程中解决问题。
2. 有效提交反馈的策略：
   1. 内容结构化：
      1. 标题：包含框架名和关键词（如 “生产问题”“测试版”），例：“ HealthKit: 锻炼会话中 paddleSports 的 totalDistance 弃用导致数据保存失败”。
      2. 内容：遵循 “问题描述→预期→复现步骤→重要性→示例项目” 结构，附日志、截图或 sysdiagnose 文件。
   2. 高优场景：
      1. 生产环境漏洞、重大回归、影响广泛的 API 问题；
      2. beta 版本期间，及时提交问题，利用 WWDC 与工程师面对面跟进。
3. 作者的反馈实践案例。

开发者可以积极参与反馈提交，尤其在 WWDC 和测试版周期中，通过结构化报告和社区分享推动平台改进。反馈不仅是对 Apple 的贡献，更是优化自身开发流程的重要手段。

### 🐢 [Reverse-Engineering Xcode's Coding Intelligence prompt](https://peterfriese.dev/blog/2025/reveng-xcode-coding-intelligence/#explaining-a-chunk-of-code)

[@zhangferry](zhangferry.com)：Xcode 26 提供了 Coding Intelligence 功能，并且支持自定义模型。但当前自定义模型支持的 URL 格式 是 ChatGPT 风格的，非这类格式例如 Gemini 还需要依赖 Proxyman 这类网络代理工具做一层转换。（感觉算是 Bug，希望后续能修复）
文中以 Xcode 中使用 Gemini 为例，抓取和分析了 AI 相关的代码解释、文档生成、代码生成这几个功能所涉及的 Prompt，每一个功能都对应一组封装好的 Prompt，可以了解到 Apple 是如何使用 PE 的：

* 行为约束：完整理解用户意图及代码再回答问题
* 前置知识：注意 Apple 平台的 API 选型；代码生成优先使用 Swift、OC；优先 Concurrency 而不是 Combine
* 代码理解：使用 SEARCH 工具（函数调用）获取代码相关上下文，再丢给 LLM
* 代码生成：除了代码本身，还会查找项目依赖，学习其 API

### 🐕 [Flutter 又双叒叕可以在 iOS 26 的真机上 hotload 运行了，来看看又是什么黑科技](https://mp.weixin.qq.com/s/jGqJFTlLqF2N_rqVdSkLKQ)

[@Damien](https://github.com/ZengyiMa)：由于 iOS 26 beta1 禁止了 Debug 时 mprotect 的 RX 权限，导致 Flutte 在 iOS 26 真机上 Debug 运行时出现了问题。为了解决这一问题，Flutter 团队采用了一种临时方案，即创建了 NOTIFY_DEBUGGER_ABOUT_RX_PAGES 函数。当 Flutter 应用需要执行新代码时，该函数会暂停应用并通知调试器，调试器随后利用其特权，通过 debugserver 修改内存权限，实现“双地址映射”，其中一个地址用于写入代码，另一个地址用于执行代码。这一方案虽然解决了当前的运行问题，但存在一定的延迟和较高的环境要求，未来仍需开发高性能的 Debug 解释器来提供更完善的解决方案。

## 代码

### 🐕 [EFQRCode](https://github.com/EFPrefix/EFQRCode)

[@Barney](https://github.com/BarneyZhaoooo)：`EFQRCode` 是一个轻量级纯 `Swift` 二维码库，支持生成带水印 / 图标的风格化二维码和图片识别功能。基于 `CoreGraphics`、`CoreImage` 和 `ImageIO`，全平台支持 `iOS/macOS/watchOS/tvOS/visionOS` 。最新 7.0.0 版本重构了 `API`，引入 `EFQRCodeGenerator` 和 `EFQRCodeRecognizer` 类，支持链式配置，改进 `Objective-C` 兼容性。可通过 `CocoaPods`、`Carthage` 或 `SPM` 集成。

## 音视频

### 🐢 [SwiftData versus SQL Query Builder](https://www.pointfree.co/blog/posts/174-free-episode-swiftdata-versus-sql-query-builder)

[@Kyle-Ye](https://github.com/Kyle-Ye): Point-Free 团队在 WWDC 2025 期间免费放送了一期重磅视频，深入对比 SwiftData 与他们自家 SQL Query Builder（Structured Queries）在实际开发中的表现。视频以还原 Apple Reminders 复杂查询为例，展示了两种方案在代码简洁性、可组合性和类型安全等方面的差异。

Structured Queries 方案只需 23 行代码即可线性表达复杂查询逻辑，支持类型安全、可读性强；而 SwiftData 不仅写法更繁琐（32 行），还存在布尔和枚举类型无法直接排序 / 筛选、可选字段排序不灵活等问题，甚至有些写法在运行时会直接崩溃。

如果你关心 Swift 持久化方案、数据层架构，或在 SwiftData 和 SQL 之间犹豫，强烈建议观看本期视频。

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2024」，领取 2024 及往年内参**

![](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/qrcode_for_wechat.jpg?raw=true)

同时也支持了 RSS 订阅：https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。

## 说明

🚧 表示需某工具，🌟 表示编辑推荐

预计阅读时间：🐎 很快就能读完（1 - 10 mins）；🐕 中等 （10 - 20 mins）；🐢 慢（20+ mins）
