# 老司机 iOS 周报 #226 | 2022-12-05

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

## 新手推荐

### 🐎 [How to fix "The compiler is unable to type-check this expression in reasonable time" error](https://sarunw.com/posts/how-to-fix-the-compiler-is-unable-to-type-check-this-expression-in-reasonable-time/)

[@zoeGuo](https://github.com/zoeGuo)："The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions" 可能是新手经常遇到的编译器报错，出现问题时，注释可疑代码可以快速定位问题，对问题代码中的表达式做出合理简化即可解决报错。文章提供了一些良好的分解、简化表达式的示例，对新手开发者会有所帮助。

## 文章

### 🌟 🐢 [C++ exception handling ABI](https://maskray.me/blog/2020-12-12-c++-exception-handling-abi#%E4%B8%AD%E6%96%87%E7%89%88)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：本文介绍的虽然是 C++ 的 Exception 处理，但其实 iOS 开发者非常熟悉的 NSException 其实也是由 ``objc_exception_throw()`` 方法中调用 ``__cxa_throw()`` 抛出的，而 ``__cxa_throw()`` 其实就是 C++ 的异常抛出。因此可以说 NSException 的抛出链路以及后续处理是与在 C++ 中直接 ``throw`` 是一摸一样的。之前我们也介绍过 [Stack unwinding](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/Reports/2022/%23224-2022.11.21.md#-stack-unwinding) 相关的内容，大家可以先了解 unwinding 相关的内容再阅读本文，这对于我们加深对栈回溯以及如何实现 Exception handling 会有更深的理解，甚至也可以尝试 `` 捕获没有被 catch 的 NSException 防止崩溃并恢复到合适的调用栈让程序运行下去 `` 类似的线上兜底方案。本文大致内容如下：
- 介绍了简化版本的 exception 处理流程（从 throw 到 catch）
- Level 1 Base ABI，描述了语言无关的 Stack unwinding 部分，定义了 _Unwind_* API ，llvm 中也有 [libunwind](https://github.com/llvm-mirror/libunwind) 对应的实现
- Level 2 C++ ABI，定义了 ``__cxa_*`` 开头的对应 API ，上文提到的 ``__cxa_throw()`` 就是在这一层定义的

### 🐕 [领域驱动设计四论](https://mp.weixin.qq.com/s/SMAycMJPWr018sU04kbfbQ)

[@莲叔](http://aaaron7.github.io/)：很多同学在学校中，学《软件工程》读《人月神话》，往往对复杂软件工程充满了幻想。但毕业投身互联网公司后，发现绝大多数项目的节奏、架构与实现似乎都与理论知识相去甚远。慢慢的我们不再关注那些伟大的设计思想，只剩满脑子的敏捷开发、动态化和热修复。这篇文章从略微偏理论的角度总结了领域驱动设计思想的几个方面，分别用于解决什么问题，怎么解决的。读完颇有一种如沐春风的感觉，不仅仅是对于这一理论的学习，更多的是从了解 DDD 如何解决软件工程复杂度获得启发，获得一个全新的视角去看待目前手头的业务与项目。推荐你耐心读完，会有启发。

### 🐎 [Testing async/await exceptions](https://arturgruchala.com/testing-async-await-exceptions/)

[@Smallfly](https://github.com/iostalks)：单元测试是保障代码健壮性的重要手段，Apple 先后提供了 `XCTAssertThrowsError(expression:)` 和 `@frozen enum Result<Success, Failure> where Failure : Error` 等异常检测方法，但对于 `async/await` 这样的协程来说并不友好。本文介绍了一种 `async/await` 风格的异常测试方法，能简化一些重复代码，推荐有需要的同学阅读。

### 🐕 [支付宝客户端体验度量与诊断](https://mp.weixin.qq.com/s/SC2DI2kWveSE1L3aBrP7og)

[@Crazy](https://github.com/jiyan135960)：本文是一篇针对性能监测设计方案讲解的佳作，写出了客户端现有的几种耗时类场景的监测方案与处理方案，虽然本文是以 Android 开发者视角来进行讲解，但其中的设计思路以及分析流程值得所有客户端开发者借鉴。本文通过以下四个方面来讲解了支付宝的性能监测是如何实现的：

- 场景度量手段
- 场景度量精度提升
- 场景性能诊断
- APM 性能平台

其中关于场景度量手段、场景度量精度提升与 APM 性能平台部分的讲解值得所有客户端开发者阅读，而关于场景性能诊断的讲解值得 Android 开发者仔细阅读。

### 🐕 [Stable Diffusion with Core ML on Apple Silicon](https://machinelearning.apple.com/research/stable-diffusion-coreml-apple-silicon)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：自 2022 年 8 月首次公开亮相以来，Stable Diffusion 已被充满活力的艺术家、开发人员和爱好者等社区采用，只需输入文本即可创建前所未有的视觉内容。苹果公司通过对 Apple Silicon 芯片的进一步优化，Core ML Stable Diffusion 模型可以更充分利用 M 系列芯片中的神经引擎和苹果 GPU 架构的优势。如要开始使用，可以访问[Core ML Stable Diffusion](https://github.com/apple/ml-stable-diffusion) 代码存储库以获取有关基准测试和部署的详细说明。

### 🐕 [一个 WebKit Bug 导致小程序页面跳转失败的问题的排查经历](https://mp.weixin.qq.com/s/Qif83v-b9MSae-a3D3IQAQ)

[@水水](https://www.xuyanlan.com/)：作者从收到一个小程序在调用 my.redirectTo() 之后，再调用 my.navigateTo() 时无响应，无法跳转下一个页面的线上问题反馈说起，到排查到是因为一个 WebKit Bug 导致的过程完整的进行了阐述。是一个比较少见的排查难度较高、问题根因较深的问题，文章将排查期间的思考记录下来，希望也可以为读者做参考。作者最后也提醒我们：人的固定认知，不一定就是对的 ~

## 音视频

### 🐢 [How to contribute a new feature to Swift?](https://www.youtube.com/watch?v=E1iMyjRpGHk)

[@Cooper Chen](https://github.com/cjlcooper)：众所周知，Swift 语言作为新一代的开发语言，其开源的特质使得开发者能够更加灵活高效的为其提供新的特性，本视频详细叙述了开发者如何为 Swift 贡献新的 feature ，其中针对开发者如何从提交一个提案到最终解决方案上线给出了详细的流程步骤解释。而对于想要为 Swift 社区提供建议和想法的开发者，视频也给出了如下建议：
- 定期阅读和浏览 Swift 表单
- 积极在社区进行反馈，并及时了解社区正在寻找的功能是什么
- 分享你的想法，并且将这个想法让更多人了解
- 尝试自己动手或与其他开发者合作
- 关注其他人的反馈

## 摸鱼周报

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

* 本期话题：圣诞节将至，请为您的 App 做好准备； Developer 设计开发加速器｜如何在游戏中支持手柄、在 iPhone 锁屏上扩展你的 App 体验
* 本周学习：class_rw_t 与 class_ro_t 的区别，面向面试的知识总结
* 内容推荐：Swift 优秀文章推荐，涉及协程，类型转换以及 `inlinable` 关键字讲解
* 摸一下鱼：CSDN 上线的工具箱工具「猿如意」；Roadmap.sh 一个总结技术路线图的网站；email 是如何工作的，一张图来告诉你；正则表达式速查卡

## 内推

重新开始更新「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）
