# 老司机 iOS 周报 #151 | 2021-03-15

![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) 提出。

## 文章

### 🌟 🐢 [内存管理设计精要](https://draveness.me//system-design-memory-management)

在早些年的 iOS 开发中，当一个 App 的内存使用大于 20m 的时候，就会收到系统的 Memory Warning，所以过去开发应用时候，也会基于此做一些优化。虽然近几年随着新机型性能的不断提升，内存越来越大，早已不再受 20m 的限制， 但是，相比于磁盘，内存依然可以算相对稀缺的资源，如果 APP 对内存使用不当，哪怕运行在最新的机型也有可能瞬间 crash 掉。本文是深入研究系统设计方法的系列文章中的一篇，主要讲内存系统的设计精要，对于想要深入了解内存的概念，并更好地使用或者优化内存的管理，本文值得各位读者花时间详细阅读！

### 🌟 🐕 [How Uber Deals with Large iOS App Size](https://eng.uber.com/how-uber-deals-with-large-ios-app-size/)

[@xiaofei86](https://weibo.com/xuyafei86)：根据 Uber 的统计，当 App 大小超过 AppStore 流量下载限制时，会导致应用程序安装减少 10%，注册减少 12%，首次预订减少 20%，从而导致收入损失。本文讲述 Uber 如何使用编译优化技术解决此问题，将 Uber App 的代码大小减少 23%，并使代码大小的增长率降低了 2 倍。

使用编译选项 [-Osize](https://swift.org/blog/osize/) 可以在模块内执行优化，编译器会通过 Function Outlining 来将重复代码片段重定向到单个实例实现压缩。但此优化对跨模块的代码则无能为力，这也将是本文的重点。

Uber 开发了自己的 iOS 构建流水线，新的流水线为每个模块生成 LLVM IR，而不是直接生成机器码。然后将所有 LLVM-IR 文件组合成一个大型 IR 文件并进行优化，再输入 [llc](https://llvm.org/docs/CommandGuide/llc.html) 生成机器码。这确保了在识别候选重复片段时，会利用最大相似性，从而实现跨模块的优化。在模块内部，LLVM 在识别时采用的贪心思想也不能实现最优解，Uber 也通过多轮识别的方式进行了优化。

本文的很多方案已经提交到 LLVM。另外，一篇描述 [论文](https://1fykyq3mdn5r21tpna3wkdyi-wpengine.netdna-ssl.com/wp-content/uploads/2021/02/cgo21main-p112-p-dbdebd6-49049-preprint.pdf) 细节的论文也发表在了 "International Symposium on Code Generation and Optimization"，感兴趣的同学可以阅读了解。

### 🌟 🐢 [【译】SE-0296 Async/await](https://kemchenj.github.io/2021-03-06/)

[@zvving](https://github.com/zvving)：大家翘首以盼的 async/await 特性，终于要在 Swift 5.5 中落地。协程的引入，让我们可以使用同步风格的代码编写异步逻辑，告别回调地狱。

[Kemchenj](https://kemchenj.github.io/about) 为我们带来 [SE-0296](https://github.com/apple/swift-evolution/blob/main/proposals/0296-async-await.md) 的译文：完整介绍引入 async/await 的动机、设计细节和权衡过程，推荐阅读。

### 🐎 [Crash 堆栈竟然无法解析？](https://mp.weixin.qq.com/s/tOdu6GJW-jdWcce1xYgcww)

[@水水](https://www.xuyanlan.com)：本文记录了一个由于对 pod 编译参数调整导致的 Crash 无法解析问题的解决和究因过程。到底是什么原因会导致 Crash 无法解析呢？感兴趣的读者可以一探究竟~

### 🐕 [闲鱼 UI 快速变形利器--擎天柱](https://mp.weixin.qq.com/s/QnUVFX6dJzDRac1SsjhSmA)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：擎天柱系统是闲鱼的标签运营平台，以此实现闲鱼 UI 样式的快速配置和实验效果的快速验证。解决了各场景标签 UI 的管理分散、需求排期难、缺乏 AB 实验等一系列问题。目前，擎天柱系统已经在闲鱼首页、搜索页的 feeds 场景落地，取得了阶段性效果：

- 推广场景覆盖和运营使用度，创建更多的个性化实验
- 增加客户端卡片模版配置模块，完善 UI 体系
- 打通算法平台，使得优质标签透出的更加智能化、个性化

### 🐢 [Molinillo 依赖校验](https://mp.weixin.qq.com/s/Kux4B4piqR43RLwiHRcHUQ)

[@红纸](https://github.com/nianran)：Molinillo 作为 CocoaPods 中核心的依赖解析工具。作者从解决依赖的入口函数 **Resolution::resolve** 入手，剖析了模块依赖 **state** 的变化、有向图的存储、依赖循环和冲突处理。文末，作者还介绍了 Molinillo 利用抽象类来解决不同平台接入的问题。

本文为[「CocoaPods 历险记」](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzA5MTM1NTc2Ng==&action=getalbum&album_id=1477103239887142918&scene=173&from_msgid=2458325057&from_itemidx=1&count=3#wechat_redirect)的系列文章的第 7 篇，非常推荐想要了解 CocoaPods 的同学阅读~

### 🐕 [如何监控 iOS 的启动耗时](https://mp.weixin.qq.com/s/mxQpsenciOu9Qw9q-VTNyg)

[@JonyFang](https://github.com/JonyFang)：APP 启动耗时的监控和优化一直是我们比较关注的问题，本文通过介绍 Render Loop 和 commit phase 的流程，分享了通过监控 ipc 通信机制监控启动耗时的解决方案。

## 代码

### [HotReloading](https://github.com/johnno1962/HotReloading)

[@EyreFree](https://github.com/EyreFree)：[InjectionIII](https://github.com/johnno1962/InjectionIII) 允许您在 iOS 模拟器中增量更新函数的实现以及类、结构或枚举的任何方法，而无需重新生成或重新启动应用程序。HotReloading 项目使 InjectionIII 的功能现在可以通过 SPM 直接引入到您的工程当中。无需下载应用程序，只需将此项目添加到您的项目中，并添加一个 `Run Script` 即可。

### [Swift for Tensorflow](https://github.com/tensorflow/swift)

[@莲叔](https://github.com/aaaron7)：Google 近期正式宣布 Swift for Tensorflow 项目将会被 archieve，也就是说暂停投入，基本上宣告了该项目的社会性死亡。虽然从项目主推者 chris lattner 在一年前离开 google 的时候就已经注定，当时[这篇帖子](https://news.ycombinator.com/item?id=22195335) 也预言了这一刻。但一年之后的现在，该来的来了后，仍然会让人唏嘘。虽然 S4TF 从诞生之日起就有了一定的关注，同时其背后的 idea 也非常创新地解决了当下以 Python 为主导的 AI 领域的一些痛点问题，虽然这两年从 Github 的 commit 记录上也能看出 S4TF 的团队一直在密集的迭代与优化，甚至从去年开始， GPUImage 的作者 Brad Larson 也加入了该团队并持续的投入到 high level api 以及 showcase model 的优化中，最终也没能改变这项技术没有被 AI 社区所接受。深究其背后的原因，其实太阳底下并无新事。社区对于技术语言、框架的接受度考量的核心指标或许并不是先进性，还包括历史包袱、程序员的偏好习惯、生态等等因素。这也就是 Python2 到 3 为什么这么难，JS 问题很多但依然是全球最流行的编程语言。这些现象背后多多少少都可以窥见端倪。

虽然最后生命力只有短短 2 年，但我仍然相信 S4TF 是非常具有冒险精神，非常大胆的一次尝试，其中众多的 compiler-oriented machine learning 技术不会死，会沉淀下来，或许在未来 5-10 年后，能够再次改变世界。

### [swift-benchmark](https://github.com/google/swift-benchmark)

[@老峰](https://github.com/gesantung)：[swift-benchmark](https://github.com/google/swift-benchmark) 是一个对代码段进行基准测试的库，有丰富的命令，可以方便的做单元测试性能测试等，类似于 [benchmark](https://github.com/google/benchmark)。

## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 iTDriverr 哦~**

## 内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（LSJCoding）会推送消息，欢迎关注。

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