# 老司机 iOS 周报 #142 | 2020-12-28

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

## WWDC20

本周在周报公众号上我们推送了 2 篇 WWDC20 内参专栏内的文章，每篇都很精彩！

- [SiriKit 新变化：让 Intent 更强大](https://mp.weixin.qq.com/s/1CxDs8qHLzEHky6yWjdseQ)
- [iOS 稳定性：使用 XCTIssue 分析诊断测试失败问题](https://mp.weixin.qq.com/s/O-awF7t4jqJVPNdL-4jidA)

## 文章

### 🌟 🐕 [2020 腾讯 Techo Park - Flutter 与大前端的革命](https://mp.weixin.qq.com/s/oflhVGs6lZBb--sOllMi8g)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 自发布到目前的 1.22 版本，已经走过了两年多的时间，这段时间以来，Flutter 一直都是跨端开发的风口浪尖，这个时候很多人不禁要问：那么未来还是么 ？ 又该如何抉择 ？本文将给你这些问题的答案。

### 🌟 🐕 [arm64 objc_msgSend 源码解读](https://www.jianshu.com/p/1972010b88d7)

[@Damien](https://github.com/ZengyiMa)：objc_msgSend 方法是 Objective-C 的 Runtime 最核心的部分，你是否好奇底层的具体实现呢？本文的作者将会从汇编的角度把 objc_msgSend 的流程梳理一遍，包括 class 查找、缓存查找、缓存未命中的处理、taggedPointer 和 nil 处理。通过本文你会加深对象结构的布局认识以及对 arm64 汇编基础指令的学习也是一个很好的入门方式。

> 由 [silan-liu](https://github.com/silan-liu) 推荐

### 🌟 🐕 [自定义 LLVM PASS 实现 函数耗时插桩统计](https://blog.0x1306a94.com/docs/llvm/ch01/01/)

[@Leo](https://github.com/leomobiledeveloper)：函数耗时分析对性能优化非常有用。目前常用的方法有两种：类似 Time Profiler 的堆栈采样分析和 hook objc_msgSend 的 OC 方法级别耗时分析。

耗时统计的本质是在函数头尾插入统计代码，能在运行时做当然也可以在编译期，这篇文章非常详细地讲解了如何在编译期间通过 LLVM PASS 实现函数耗时统计，不仅能覆盖 OC ，还能覆盖 C、C++ 等其他语言。

### 🐕 [HTTP/2 做错了什么？刚刚辉煌2年就要被弃用了！？](https://mp.weixin.qq.com/s/DLmg_SGGx0iyXepuhQB8pg)

[@AidenRao](https://weibo.com/AidenRao)：HTTP/2 的诞生，主要是通过多路复用技术，解决 HTTP/1.1 中的效率问题。但依旧存在很多不足，因为 HTTP/2 底层是采用 TCP 协议实现的，存在 TCP 队头阻塞，三次握手耗时过长问题。

所以，HTTP/2 推出没多久，业内就开始大力投入 HTTP/3 的研发与推广，HTTP/3 选择了一种新的技术方案，基于 UDP 协议改造的 QUIC (Quick UDP Internet Connections)，作者会在后续的文章对 HTTP/3 进行详细介绍。

### 🐢 [What Every Computer Scientist Should Know About Floating-Point Arithmetic](https://floating-point-gui.de/)

[@JonyFang](https://github.com/JonyFang)：我们应该都写过类似这样的简单代码：
```
0.1+0.2
```
与我们预期不同的是，它实际得到的结果是：
```
0.30000000000000004
```
那么我们为什么会得到这个结果？如何处理这类问题？关于这类常见浮点数问题的解答，我们可以通过这个网站来找到答案。如果读者有兴趣，也可以提供更深入的解释，说明为什么浮点数必须如此工作以及可能还会出现其它哪些问题。

## 工具

### [Stringz iOS Apps Localization Editor](https://github.com/mohakapt/Stringz)

[@Parsifal](https://github.com/ParsifalC)：一款很好用的做 App 本地化的工具，UI 简明清晰，并且能自动识别工程内的所有本地化文件。

## 代码

### [CalendarKit](https://github.com/richardtop/CalendarKit)

[@老驴](https://www.weibo.com/6090610445)：日历，尤其是复杂的日历 UI 都是产品开发中费时费力的部分，很多时候，因为缩减开发周期，设计师也会选择跳过这部分转而使用原生的日历 App 来设计功能。这个 CalendarKit 就是由一位外国朋友开发维护的开源日历 UI 库，可以很方便的进行日历相关功能的集成。

> 由 [理查德·托普奇（ Richard Topchii ）](https://github.com/richardtop) 推荐

### [RealityUI](https://github.com/maxxfrazer/RealityUI)

[@Parsifal](https://github.com/ParsifalC)：如果你正在做 AR/VR 相关的开发，那么这个库一定对你很有帮助。RealityUI 提供了一系列的控件，让你可以像做 2D 应用一样开发 AR/VR 应用。

> 由 [XanderXu](https://github.com/XanderXu) 推荐，他长期研究 ARKit 相关技术，编写有 [ARKit Tips](https://xiaozhuanlan.com/u/xanderxu) 等多个专栏

## 音视频

### 🌟 🐕 [Apple tech-talks 10855 10856 10857](https://developer.apple.com/videos/play/tech-talks/10855)

[@莲叔](https://github.com/aaaron7)：Apple Developer 上推出的三个新的 Tech Talk，链接地址分别是:

* [10855 Explore UI animation hitches and the render loop](https://developer.apple.com/videos/play/tech-talks/10855)
* [10856 Find and fix hitches in the commit phase](https://developer.apple.com/videos/play/tech-talks/10856)
* [10857 Demystify and eliminate hitches in the render phase](https://developer.apple.com/videos/play/tech-talks/10857)

首先是第一讲，10855 介绍了在 iOS UI 开发中的 hitch（故障，卡顿） 的定义。 之后介绍了 iOS 渲染的 3-阶段模型。进一步阐述了 hitch 出现的原因和类型，最后还给出了衡量 hitch 对于用户体验影响的指标。

接下来的两讲分别讨论了如何解决 commit 阶段和渲染阶段的耗时：

* 10856 首先介绍了 commit 阶段的定义， commit 阶段指的是当事件发生时， App 进程处理相关的 UI 更新到更新完成，提交到 Render 进程的时间。主要分为四个阶段: Layout、Display、Prepare、Commit。 Layout 和 Display 阶段往往就对应我们 View 的 layoutSubview 和 drawrect, 是最容易导致卡顿的点。之后，视频结合一个具体的案例来介绍了如何使用新的 instruments 来定位 commit 阶段的 hitch， 最后给出了一些最佳实践来避免耗时。
* 10857 首先介绍了 render 阶段做的事情，然后引出了导致 render 阶段耗时的核心原因：离屏渲染。即 GPU 无法串行的执行所有绘制任务，而是需要中断主 pipeline 去先做一部分离屏渲染之后才能完成当前任务。之后介绍了如何使用 Xcode 的 View Hierarchy Debug 面板配合 Instrument 去找到当前介绍触发离屏渲染的元凶。最后，类似 10856， 本视频后续也给出了一些平时开发的最佳实践的建议。

这三讲的内容非常富有启发性，讲解 hitch 是一方面，更有价值的是借这个过程阐述了 iOS 的 UI 机制，让我们能够在做优化时候不仅能知其然，更能知其所以然。比如圆角、阴影到底为什么会影响帧率，Flutter 在 iOS 上对比原生的性能为什么相比 Android 差这么多这些问题，相信你看完都能有答案。

> 由 F010BE 推荐

## 赞助者

虚位以待..

**非常感谢以上赞助者的支持，如果你也有赞助我们的兴趣，欢迎添加微信 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）
