# 老司机 iOS 周报 #133 | 2020-10-26

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

**热烈欢迎社区老朋友 [Leo](https://github.com/LeoMobileDeveloper) 加入周报编辑组！[Leo](https://github.com/LeoMobileDeveloper) 目前就职于字节跳动，负责抖音 和 TikTok 基础体验优化。**

## WWDC20

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

- [iOS 性能优化：用电池和性能 API 识别性能趋势](https://mp.weixin.qq.com/s/mX4PXtIG7eQGD1tDNKNNFw)
- [iOS 稳定性：App 被终止的原因](https://mp.weixin.qq.com/s/l8KjyTxCJis-tFUitAj-0g)
- [iOS 性能优化：用 Xcode Organizer 诊断性能问题](https://mp.weixin.qq.com/s/XiiQpzY7mJqdD96Lpja_4Q)

## 新闻

### [周报 1024 活动 & 书单推荐](https://mp.weixin.qq.com/s/h1jGebb-t4EYo8ENv2Kdhw)

[@Parsifal](https://github.com/ParsifalC)：上周六是 1024 程序员节，周报也给大家发了一波福利，截止现在所有抽奖活动均已结束，如果你中奖了但未收到周报微信联系，请添加「iTDriverr」私聊~另外未中奖的朋友，依然可以使用当当网优惠码自行购买，书单真的很不错！

## 新手推荐

### 🐎 [The Ultimate Guide to the SwiftUI 2 Application Life Cycle](https://peterfriese.dev/ultimate-guide-to-swiftui2-application-lifecycle/)

[@Parsifal](https://github.com/ParsifalC)：自去年 Xcode 11 与 iOS 13 发布时，苹果就引入了 `SceneDelegate` 来替代 `AppDelegate` 接管了 App 生命周期的管理。今年 WWDC SwiftUI 2.0 亮相，同时苹果也介绍了其全新的 App 生命周期管理方式。这篇文章很细致地介绍了如何使用新的 API 来进行 App 生命周期管理。

## 文章

### 🌟 🐢 [iOS 性能优化实践：头条抖音如何实现 OOM 崩溃率下降 50%+](https://mp.weixin.qq.com/s/4-4M9E8NziAgshlwB7Sc6g)

[@Leo](https://github.com/leomobiledeveloper)： OOM 率是衡量 App 整体质量的重要指标之一。目前大家普遍采用排除法来判断 OOM ，能够较为准确的判断出线上用户发生了 OOM ，但归因分析手段却比较欠缺，导致定位修复问题困难。字节跳动技术团队提出了一种基于内存快照技术的方案 - Memory Graph，其原理是在快发生 OOM 的时候 dump 内存快照，建立内存节点的引用关系，能够大幅度提高排查线上 OOM 问题的效率，在头条抖音落地后 OOM 率下降50%+。本文结构清晰，内存相关研究非常深入，是一篇值得花时间仔细阅读的好文。

### 🌟 🐢 [深入理解 Dart 空安全](https://mp.weixin.qq.com/s/MEL5kokoyb0CJcjrPpo12w)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 空安全已经成为现代编程语言的一个标配，比如 Swift 中的 Optional。 空安全机制，使得我们可以更加优雅的编写判空代码，同时代码健壮性也得到了极大提升。 Dart 自然也不例外，自 Dart 2.0 以后引入了空安全机制，但少有人能完整理解，甚至于现在可以在很多 Flutter 项目中看不到相应的代码，本文由 Google Dart 团队工程师 Bob Nystrom 分享，为你详细讲解 Dart 空安全机制，强烈推荐。

### 🐎 [@warn_unqualified_access](https://fivestars.blog/swift/warn_unqualified_access.html)

[@xiaofei86](https://weibo.com/xuyafei86)：在最近的 Swift 版本中，我们已经看到了一系列新的 attributes，如 @unknown，@propertyWrapper，@main 等。在这篇文章中，作者将带领我们了解一个少为人知的，但同样有用的旧有属性  @warn_unqualified_access。其在 Swift 2 中悄悄引入，用来帮助我们消除调用顶级函数、静态方法、实例方法时的歧义。感兴趣的同学可以详细阅读。

### 🐕 [自研 iOS 热更新机制——OCPack 技术方案总结](https://mp.weixin.qq.com/s/x7c5mHJINcWpGCuHPDNNPw)

[@J_Knight_](https://github.com/knightsj)：本文分享了一种在 iOS 平台上的 App 动态化技术方案：OCPack。OCPack 提供的工具链可以将 .m 文件生成 .bin 格式的 patch 文件，该文件可以在一个基于 Native 环境的虚拟栈机加载并执行，从而达到动态化更新的效果。作者从编译模块、汇编模块、加载模块和执行模块来分别讲解了 OCPack 方案的实现方式，同时也介绍了该方案的优势和未来的迭代计划。

### 🐎 [App 崩溃现场取变量名和其实际值对应关系（不只是寄存器）](https://juejin.im/post/6883160410736820231)

`.DYSM` 是编译过程中产生的符号文件，一般用于崩溃日志的解析。许多同学已经知道在拿到  `.DYSM` 文件后如何将崩溃栈中的指令地址转换为实际代码文件及其对应行号，可是如何得到崩溃现场当前方法中各个变量名和其当前值（而不是只有寄存器）呢？因为这样也更有助于我们更快更准确地去定位问题。本文通过实践解答了这个问题，感兴趣的同学可以了解一下。

> 由 [jzhang46](https://github.com/jzhang46) 自荐。

### 🐕 [Evolution of the programming languages from iPhone OS 1.0 to iOS 14](https://blog.timac.org/2020/1019-evolution-of-the-programming-languages-from-iphone-os-to-ios-14/)

[@Parsifal](https://github.com/ParsifalC)：从最早的 iPhone OS 到现如今的 iOS，苹果在移动端的系统已经迭代了 14 个版本。作者写了个脚本，分别统计了 C/C++/Objective-C/Swift 以及 SwiftUI 在 iPhone OS 1.0 - iOS 14 间的使用比例，最终通过柱状图非常直观地展示了这个变迁史。以 iOS 14 为例，作者的统计结果是：
- Objective-C:88%
- C++:17%
- Swift:8%
- C:8%
- SwiftUI:1%

除了整个统计数据比较有意思，作者还很详细地整理了他是如何写这个脚本的，对于想要做类似统计的朋友来说还是很有参考意义。

## 工具

### [GoSwifty](https://github.com/rsrbk/GoSwifty)

[@Parsifal](https://github.com/ParsifalC)：一个统计项目中 Swift 和 OC 代码比例的小工具，由 Swift 编写，正在做 OC 老项目迁移的朋友可以用起来跟进重构进度。

## 代码

### [SYWebViewBridge](https://mp.weixin.qq.com/s/JDCyWg1AYemxbnFbvY5E9w)

[@享耳先森](https://github.com/iblacksun)：SYWebViewBridge 是一个 Hybrid 与 Native 通信的开源库，基于自定义 scheme 实现，目前还处于 Beta 阶段，大家可以看下具体实现思路。

### [YYJSON](https://github.com/ibireme/yyjson)

[@Parsifal](https://github.com/ParsifalC)：由 [YYKit](https://github.com/ibireme/YYKit) 的作者 [ibireme](https://github.com/ibireme) 基于 ANSI C 编写的高性能的 JSON 库。作者对性能优化一直有比较深刻的研究，YYJSON 依然沿袭了这一特点，与主流框架对比在性能上有较明显提升。

## 赞助者

[Woodpecker](https://apps.apple.com/cn/app/woodpecker/id1333548463?mt=12): iOS开发辅助工具，提供沙盒文件、UserDefaults、视图层级在线查看和编辑等功能，在工作中能极大提升开发效率，Mac App Store免费下载！

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