# 老司机 iOS 周报 #217 | 2022-09-19

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

## 文章

### 🐢 [字节跳动 DanceCC 工具链系列之 Xcode LLDB 耗时监控统计方案](https://mp.weixin.qq.com/s/4DgbZosBit-kTVhYMwRlHw)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：在 [字节跳动 DanceCC 工具链系列之 Swift 调试性能的优化方案](https://blog.csdn.net/YZcoder/article/details/124684083) 一文中，介绍了如何使用自定义的工具链，来针对性优化调试器的性能，解决大型 Swift 项目的调试痛点。为了精确测量经过优化后的 LLDB 调试 Xcode 项目效率提升效果，衡量项目收益，需要开发一套能够同时获取 Xcode 官方工具链与 DanceCC 工具链调试耗时的耗时监控方案。本文详述了 DanceCC 提出了一套专门的方案，方案原理基于 LLDB Plugin，利用 Fishhook，从 LLDB 的 Script Bridge API 层面拦截 Xcode 对 LLDB 调用，以此来进行耗时监控统计。

### 🐢 [这一年，我对终端组织与技术架构的思考【专家讲技术】](https://mp.weixin.qq.com/s/BGGsuYrlojMfTqfTo71VZg)

[@莲叔](http://aaaron7.github.io/)：闲鱼是国内较早进行 Flutter 业务尝试，也是较早的全面拥抱 Flutter 的 App。本篇文章里，闲鱼的技术负责人宗心分享了他对于移动开发行业从软件架构和组织形式两个视角的变迁，之后提出了未来可能的一种岗位分工：应用研发工程师和基础设施开发工程师，并且发布了闲鱼围绕这样的岗位分工开发的一套基于 Flutter 的 UI 开发渲染引擎 KUN。移动开发到如今已经发展的超过十年的时间，研发团队相比最开的 iOS/Android 开发已经演化出了更复杂的形式，这篇文章是对这些趋势一个比较不错的归纳，对自己技术栈觉得迷茫的同学也可以看看。

### 🐎 [基于 React Native 的动态列表方案探索](https://mp.weixin.qq.com/s/5Oa45FN3SECveu6_N89k2A)

[@Damien](https://github.com/ZengyiMa)：动态渲染框架大家一定不陌生，比如阿里的 DinamicX、Tangram 大家应该都很熟悉了，基于 DSL 的动态化方案虽然有性能上的一些优势，但是毕竟不是图灵完备的，一些需要逻辑动态下发的需求实现成本偏高，网易云音乐团队带来了他们的最佳实践，基于 React Native 的动态列表方案。简单来说就是将 ReactNative 容器内嵌在 RecyclerView 的 ViewHolder 中，页面主体框架还是由 Native 开发和渲染，首屏加载速度得到了保证，局部的 RN 实现也使页面获得动态化的能力。有兴趣的同学不妨一读。

### 🐢 [终极 C++ 避坑指南](https://mp.weixin.qq.com/s/Isr5-FojMTRK36g-Gh2_yQ)

[@xuyafei](http://github.com/xiaofei86)：C++ 是一门古老的语言，但仍然在不间断更新中，不断引用新特性。但与此同时 C++ 又甩不掉巨大的历史包袱，并且 C++ 的设计初衷和理念造成了 C++ 异常复杂，还出现了很多不合理的“缺陷”。本文主要有 3 个目的：
1. 总结一些 C++ 晦涩难懂的语法现象，解释其背后原因，作为防踩坑之用
2. 和一些其他的编程语言进行比较，列举它们的优劣
3. 发表一些我自己作为 C++ 程序员的看法和感受

### 🐢 [如何判断 ScrollView、List 是否正在滚动中](https://juejin.cn/post/7143002835192381471#heading-0)

[@老峰](http://github.com/gesantung)：SwiftUI 并没有提供这方面的 API 。本文将介绍几种在 SwiftUI 中获取当前滚动状态的方法，每种方法都有各自的优势和局限性。
1. Introspect：通过访问其背后 Delegate 的 UIKit 控件；优点准确、及时、系统负担小；缺点向后兼容性差。
2. Runloop：创建绑定于不同 Runloop 模式下的 TimerPublisher ，实现对滚动状态的判断；优点简单、准确、及时；缺点只支持 iOS，屏幕中只能有一个可滚动控件。
3. PreferenceKey：子视图可以通过 preference 视图修饰器向其祖先视图传递信息；优点支持多平台，前后兼容；缺点需要为可滚动容器的子视图添加修饰器，判断的准确度没有前两种方式高。

另外作者针对以上方案写了 [IsScrolling](https://github.com/fatbobman/IsScrolling) 开源库，有需要的同学可以参考。

### 🐢 [你真的懂 iOS 的异常捕获吗？](https://juejin.cn/post/7142656591139962888#heading-16)

[@邦Ben](https://weibo.com/linwenbang)：我们的开发中一定会接触到异常捕获，本文作者从操作系统层面进行分析。在触发异常的时候，会让应用从用户态切换到内核态进行处理。文章中介绍到，异常分成两类：1. 硬件异常，2. 软件异常。触发了异常，一条包含异常信息的 Mach Message 会通过 Match Exception 机制进行传递到注册的端口，从而被处理。Mach Exception 如果没有在 tread 和 task 中得到处理，那么会转成成 Unix Signal 信号。所以需要做的就是捕获 Mach Exception 以及 Unix Singal，具体的代码，文章中进行了讲述。想详细了解的，具体看一下文章，同时可以去参考一些开源的 CrashReport 库。

### 🐕 [Clip control on the Apple GPU](https://rosenzweig.io/blog/asahi-gpu-part-6.html)

[@AidenRao](https://weibo.com/AidenRao)：Apple 最新的 Mac 系列包括他们内部的 "M1 " 系统芯片，具有一个定制的 GPU，既没有公共文档也没有开源驱动程序。苹果为 App Store 开发者提供的 Metal 只具备有限的 API，缺乏对 OpenGL 功能的支持。文章作者提供了多种解决方案，去支持 OpenGL 的 clip control，最终实现在 Mac OS 上运行游戏 [Neverball](https://neverball.org/)。

### 🐕 [特效侧用户体验优化实战 -- 包体积篇](https://mp.weixin.qq.com/s/3ZrRW0iRSBjqs0ix4FWzZA)

[@JonyFang](https://github.com/JonyFang)：在了解了特效基础的包体积组成，可以针对性的对编译选项、代码进行调整，以优化包体积。同时介绍了包体积监控工具，输出每个需求带来的包体积增长大小、包体积增长原因，及时给出包体积告警、定位异常增量 case，减缓包体积增长，推动业务优化。

### 🐕 [What's the "any" keyword? Understanding Type Erasure in Swift](https://swiftrocks.com/whats-any-understanding-type-erasure-in-swift)

[@享耳先森](https://github.com/iblacksun)：Swift 的强类型是程序健壮性的基石。但在过去，有些特殊场景下强类型给开发者带来一些不必要的规避工作，Swift 5.7 引入的 `any` 关键词很好的解决了这一问题。本文解释类型擦除的概念，以及过去是如何做的？有 `any` 后有什么不同？建议结合 [Existential any in Swift explained with code examples](https://www.avanderlee.com/swift/existential-any/) 一起阅读。

### 🐕 [iPhone 14 Screen Sizes](https://useyourloaf.com/blog/iphone-14-screen-sizes/)

[@Barney](https://github.com/BarneyZhaoooo)：本文主要介绍了 2022 年 iPhone 14 屏幕尺寸变化的回顾，并配有简单易懂的样例图，一目了然。

## 工具

### [Regex101, 正则调试在线工具](https://regex101.com)
[@anotheren](https://github.com/anotheren/)：Regex101 是一个正则调试的在线工具，提供了大量的帮助信息来优化正则编写，甚至还提供了 Code Generator 来直接生成相关语言的代码（支持 Swift）。不仅仅是方便新手，如果你也经常与正则打交道，可以试试这个工具。

## 摸鱼周报

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

* 本期话题：iPhone14 灵动岛创意前瞻
* 本周学习：OC 泛型中的  `__covariant`  与 `__contravariant`
* 内容推荐：编译和热重载优秀文章推荐
* 摸一下鱼：关于 iOS 开发国际化相关工具推荐

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 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）
