# 老司机 iOS 周报 #327 | 2025-03-17

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

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

## 新闻

### [iOS Versions Market Share in 2025](https://telemetrydeck.com/survey/apple/iOS/majorSystemVersions/)

网页展示了使用 iOS 系统（包括 iPadOS）的用户的分布变化，其中有两条结论：

1. 自 2024 年 9 月推出以来，iOS 18 已成为迄今为止份额最高的版本。截至 2025 年 2 月底，该比例为 79.54%。
2. 截至 2024 年 8 月底，iOS 17 是占主导地位的版本，占 87.70% 的份额。截至 2025 年 2 月底，它已降至 13.68%。

## 新手推荐

### 🐎 [通过覆写方法看 Swift 方法派发](https://blog.rakuyoo.top/swift-method-dispatch-via-overriding/)

[@DylanYang](https://github.com/Dylan19Yang)：作者通过一个子类覆写方法的 Demo 向我们解释了 Swift 内静态派发和动态派发两种机制，并介绍了 @objc 和 dynamic 关键字的含义，讲述了如何在 extension 中正确的覆写父类方法。看完以后感兴趣的同学也可以尝试再研究下 Protocol 方法的派发机制。

## 文章

### 🐢 [A Journey to understand LLVM-IR](https://un-devs.github.io/low-level-exploration/journey-to-understanding-llvm-ir/)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：对于 iOS 开发来说，接触 LLVM-IR 的机会不多，一般逆向研究系统库时会直接反汇编，研究 Swift 时大部分情况阅读 sil(Swift Intermediate Language) 即可解决大部分问题。但也有极端情况下，需要研究 IR 优化时，就需要这块知识了。作者虽然是以 C/Rust 语言的视角进行讲解，但是对于 OC/Swift 是一样的。文章内容大致包含下面几块：

1. IR 的 静态单一分配 (static single assigment representation)
2. 开启 mem2reg 讲解生成的 IR 代码
3. 再对比 x86 汇编与 IR 代码的对应

### 🐕 [op run](https://nshipster.com/1password-cli/)

[@AidenRao](https://weibo.com/AidenRao)：这篇文章探讨了传统 .env 文件在开发中的痛点（配置同步难、多环境管理复杂、变更追踪缺失），并介绍了 1Password CLI（op）的解决方案。通过 op run 命令动态注入环境变量，开发者可用 op://URL 引用密钥库中的敏感数据，实现配置与代码分离。步骤包括安装 CLI、创建共享保险库、迁移密钥、更新.env 文件为引用格式，并调整启动命令。

### 🐕 [What drives your users to pay? Jobs to Be Done has the answers](https://www.revenuecat.com/blog/growth/what-drives-users-to-pay-jobs-to-be-done/)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：本文探讨了 Jobs to Be Done (JTBD) 理论如何帮助企业理解用户真正的需求，并通过精准定位驱动更强的产品变现能力。主要内容如下：

1. 了解用户购买动机：痛点驱动 vs. 需求驱动
2. 如何进行 Jobs to Be Done 访谈，发现变现关键点
3. 三种核心驱动力：功能、情感和社交
4. 如何优化定价、转化和留存
5. 利用 JTBD 扩展高价值用户群

### 🐢 [当 Swift 编译器删除了标准库中的代码 - 记修复 Swift 6 中的冗余 Load 指令消除优化器](https://mp.weixin.qq.com/s/MLYm8S8vMeI9y06SgAGfFw)

[@david-clang](https://github.com/david-clang)：本文首先通过最小复现代码，展示了在 `-Osize` 优化级别下使用 `AutoreleasingUnsafeMutablePointer` 导致的 use-after-free（UAF）崩溃问题。

通过反汇编和 SIL 分析，发现 Swift 编译器在冗余 Load 消除优化（RLE）过程中，因误判 `_reserveCapacityAssumingUniqueBuffer` 函数的副作用，错误删除了数组扩容后必须重新加载缓冲区地址的 `load` 指令，致使后续代码访问已释放内存。

作者还给出了修复方案，通过调整逃逸分析对 `unchecked_ref_cast` 指令中 Optional 转换的路径追踪逻辑，确保编译器正确识别副作用，从而避免冗余 `load` 指令消除，修复 UAF 崩溃问题。

文章结尾还分享了调试 Swift 编译器的技巧，全文为深入理解 Swift 编译优化机制提供了宝贵参考。

## 代码

### [RealityShaderExtension](https://github.com/XanderXu/RealityShaderExtension)

[@BluesJiang](https://github.com/BluesJiang): visionOS 开发官方有两套可选的开发方式，一种是使用 RealityKit，另一种是使用基于 Metal 的自制引擎来自己绘制。苹果推荐使用的 Unity 的 PolySpatial，一种将 Unity 的内容直接导出到 visionOS 上的方式，也是通过第二种模式运行的。
但是第二种模式会存在许多限制，比如没有眼动追踪等。所以有时候还是需要使用原生的开发方式。但是为了保证渲染效果的一致性，作者经常需要将在 Unity 中实现的 Shader 再在 ShaderGraph 中实现一遍。而二者默认提供的 Shader 节点并不一致。
所以作者将 Unity 中有而 RealityKit 中没有的 Shader 效果实现了一遍，并且开源。visionOS 的原生开发玩家可以关注一下。

## 音视频

### [How to Do Apple Search Ads (ASA) Right and Grow Your Downloads](https://www.youtube.com/watch?v=W6_bN3AZo_s)

[@Kyle-Ye](https://github.com/Kyle-Ye): 如何使用 Apple Search Ads 提升你的下载。作者分享了配置使用 ASA 完整流程和一些实用技巧，有自己的独立 App 需要推广的可以学习下。

## 内推

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

[上海] TikTok - 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）
