# 老司机 iOS 周报 #236 | 2023-03-13

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

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

## 新闻

### [App Store 的定价机制升级现已扩展至所有购买类型](https://developer.apple.com/cn/news/?id=dbrszv62)

1. `` 增强全球定价机制 `` 的推出：在 5 月 9 日还未选择定价机制的 App ，默认会按照“全球定价”并以美元进行结算。开发者也可以即日起主动进行调整。
2. 更新后的价格将根据金融数据机构提供的公开汇率信息做调整。

由此，通过汇率差或者切区充值的方式成为历史，如果开发者未选择上架的地区，用户即使通过切换地区也无法进行支付。

##  Developer - 设计开发加速器

### [在 iPad App 中支持多窗口](https://developer.apple.com/cn/accelerator/)

多任务处理是让你的 iPad App 更加强大的方式。本次课程你可以学习如何轻松支持多窗口功能，了解如何创建、刷新和关闭窗口。你还可以了解如何利用高级手势创造更加出色的体验。报名时间截止 2023 年 3 月 15 日。


## 文章

### 🐕 [SwiftUI + Core Data App 的内存占用优化之旅](https://juejin.cn/post/7207787191623335992#heading-0)

[@Cooper Chen](https://github.com/cjlcooper)：本文主要介绍了 SwiftUI 在图文混排等复杂应用视图情况下，如何进行内存占用进行优化的方案。通过视图 body 值优化、托管对象回归惰性状态、私有上下文、不持有托管对象等方式，大大提高了 SwiftUI 在复杂视图情况下的内存占用情况，为相关开发同学提供了许多优秀的建议，值得一读。

### 🐎 [Swift 5.7 / Xcode 14 incremental build time 10x slower than Swift 5.6 / Xcode 13](https://forums.swift.org/t/swift-5-7-xcode-14-incremental-build-time-10x-slower-than-swift-5-6-xcode-13/60568/2)

[@zvving](https://github.com/zvving)：如果你的项目在升级 Xcode14 后碰到增量编译时间大幅劣化的情况，大概率是 Swift 新版集成驱动的问题，不妨试试配置 `SWIFT_USE_INTEGRATED_DRIVER` -> `NO`，可能会有很好的效果。（配置后需要手动清空构建文件夹 `CMD+Shift+K`）

### 🐎 [Xcode 编译加速之 Compile Asset Catalog](https://juejin.cn/post/7207848485856231482)

[@anotheren](https://github.com/anotheren): 在项目规模变大后，资源文件也会不可避免的增多，导致生成 Asset.car 时占用大量时间进行图片压缩。这在 Release 时是必须的，但是在 Debug 时，我们可以跳过这个过程以优化编译时间。来看看具体如何操作。

> 推荐人：[gbfansheng](https://github.com/gbfansheng)

### 🐎 [苹果：为了安全让 M2 吃灰](https://catcoding.me/p/apple-perf/)

[@kemchenj](https://kemchenj.github.io/)：macOS 本身有一个安全机制来防止恶意程序运行，在程序或脚本首次运行时会上传 checksum 到苹果服务器，与现有的恶意程序名单进行比对，如果没问题才会放行让程序执行，导致首次启动时需要较长的时间。

但在我们的日常开发中，可能会需要大量生成和运行一次性的程序，例如修改代码之后编译运行的程序，每次都是全新，意味着程序每次都需要到苹果服务器进行一次校验。

当程序达到一定数量的时候就会造成性能问题，例如文中提到的 rust 测试原本只需要 1 分 30 秒左右，受到这个安全机制的影响执行时间被拉长到 10 分钟，对于日常开发体验影响非常大。

文章观点可能有点偏激，但使用 macOS 的开发者确实有必要意识到这件事情，并且这个问题可以通过一些设置来解决，可以在系统设置里将开发用的 App 加入到白名单里绕过这个验证（例如 Xcode, VSCode, Iterm2 等等），解决上述的性能问题。

### 🐎 [iOS 底层之类的 cache 分析](https://juejin.cn/post/7206143969121943589)

[@J_Knight_](https://github.com/knightsj)：本文详细介绍了类结构体中的 cache 字段：具体从 cache 的数据结构、bucket_t 类型以及关键方法 insert 的源码讲解了缓存插入的逻辑，也介绍了缓存扩容的逻辑。最后在结尾处提供了 cache_t 的工作原理流程图，可以更直观地看到 cache_t 的机制。

### 🐕 [通过 Bazel 构建 iOS 应用](https://bazel.build/start/ios-app?hl=zh-cn)

[@JonyFang](https://github.com/jonyfang): Bazel 是 Google 推出的一款开源的工程编译工具，类似于 Make、Maven 和 Gradle。Bazel 主要负责处理代码构建相关问题，如：大规模数据构建问题，共享代码库问题，从源代码构建的软件的相关问题。Bazel 支持多种语言并且跨平台，还支持自动化测试和部署、具有再现性（Reproducibility）和规模化等特征。这里主要是介绍通过 Bazel 构建 iOS 应用。

### 🐎 [迈向卓越 - 闲鱼终端场景 CI 能力体系化建设](https://mp.weixin.qq.com/s/1WaRRQXxsFZlWA1oT1jldA)

[@xuyafei86](https://github.com/xiaofei86)：“闲鱼从 2014 年创立，到 2022 年已经走过了 8 个年头，闲鱼 APP 也随之逐渐复杂。在这其中，我们也面临着大型 APP 共性的一些通病，例如：团队规模变大带来的研发效能瓶颈的问题，大量历史代码带来的代码腐化问题等。从解决实际问题出发，闲鱼终端团队和质量团队一起协作在 2022 财年进行了 CI 能力体系化建设，并已经通过在单测，代码质量，自动化测试 & 回归等方面的建设，形成了一整套的能力沉淀。通过这些能力，我们成功在闲鱼终端研发场景下实现了代码质量的稳步的提升，并在部分仓库现了向类主干开发模式的切换。本文将分享整个能力建设的过程以及我们在其中的思考，希望能给大家带去一些借鉴。”

### 🐕 [这代码居然有差别？CPU 友好的代码该这样写](https://mp.weixin.qq.com/s/VXB4WqdN5ryc2TU7haxh_A)

[@Crazy](https://github.com/jiyan135960)：本文作者从循环效率入手，向大家简单的讲解了 CPU 的缓存机制，以及怎样写出优秀循环。作者通过一个矩阵相乘的三种不同的循环写法，用看似相同的代码，得到相同的结果，并计算这三种循环的效率。最后的结果却让人震惊，这三种循环方式其中的效率能够相差百倍之多。其中最大的问题就在于 CPU 的缓存命中率，利用先从左到右，再从上到下的循环方式读取数据，可以提升百倍效率。本文为开发者提供了一个少见却高效的性能优化的方向，了解一些硬件原理，顺应硬件的处理规则，才能写出更加行之有效的软件代码。

## 工具

### [ZMarkupParser](https://github.com/ZhgChgLi/ZMarkupParser)

[@红纸](https://github.com/nianran)：这个纯 Swift 的 GitHub 仓库使用正则表达式解析 HTML，并自动修正标签错误。它支持高度定制的 HTML 标签样式，比传统的 NSAttributedString.DocumentType.html 更高效，不依赖任何解析库。它的实现原理是使用 Tokenization 将 HTML 转换成抽象语法树，并使用 Visitor Pattern 将 HTML Tag 与抽象样式对应，得到最终的 NSAttributedString 结果。如果你需要一款快速、高效、准确的 HTML 解析器，这个仓库是一个不错的选择。

> 推荐人：[ZhgChgLi](https://github.com/zhgchgli0718)

### [Swift Evolution proposals in Alfred](https://oleb.net/blog/2023/alfred-swift-evolution/)

[@zoeGuo](https://github.com/zoeGuo)： [Swift Evolution](https://www.swift.org/swift-evolution/) 记录了 Swift 主要或者次要版本的目标以及开发者对 Swift 的更改建议，还记录了这些想法是如何被提出、讨论、审查，并最终被接受到即将发布的版本中的。阅读 Swift Evolution proposals 可能在我们理解、使用 Swift 时起到关键性作用。那么 [Alfred](https://github.com/attaswift/alfred-swift-evolution) 就是一个能够帮助我们快速查找 Swift Evolution proposals 的工具，可以使用关键字或者 proposal id 搜索快速获取到对应文档的连接和相关 proposal 的状态等。之前已经用过的读者也可以去更新最新的 [v2.1.0](https://github.com/attaswift/alfred-swift-evolution/releases/tag/v2.1.0) 版本获得更好的体验。


## 代码

### [buildbuddy-io / rules_xcodeproj](https://github.com/buildbuddy-io/rules_xcodeproj)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：这个存储库包含了 Bazel 的规则，可以用来从工作空间中的目标生成 Xcode 项目。它包含了全面的 Bazel 规则支持、需要最少的配置等诸多特性，目前已有多个项目使用 rules_xcodeproj，可以根据[使用指南](https://github.com/buildbuddy-io/rules_xcodeproj/blob/main/docs/usage.md)进行构建。


## 摸鱼周报

[@摸鱼周报 #86](https://mp.weixin.qq.com/s/y1_V0WKfdwsUL2WjP2zPyA)：第 86 期摸鱼周报来了，一起来看下本期概要：

* 本期话题：Apple 公布 iOS 16 的普及率已达 81%
* 内容推荐：继续推荐近期的一些优秀博文，涵盖 Swift 混编 Module、App Store 价格新政、内存优化、Xcode 命令行参数和构建配置等方面的内容
* 摸一下鱼：一些新的基于 ChatGPT API 的工具如雨后春笋般产生，产品形态有这几个：移动端、watch 端、浏览器插件、网站等

## 内推

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

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

## 关注我们

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

**关注有礼，关注【老司机技术周报】，回复「2021」，领取 2017/2018/2019/2020 内参**

![](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）
