# 老司机 iOS 周报 #258 | 2023-08-28

![ios-weekly](https://github.com/SwiftOldDriver/iOS-Weekly/blob/master/assets/weekly-header/258.png?raw=true)
老司机 iOS 周报，只为你呈现有价值的信息。

你也可以为这个项目出一份力，如果发现有价值的信息、文章、工具等可以到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 里提给我们，我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 [Issues](https://github.com/SwiftOldDriver/iOS-Weekly/issues) 提出。

## 新闻

### 🌟 [Flutter 3.13 更新](https://mp.weixin.qq.com/s/4zM6hwGKsR0X7E6n2VlCXA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): Flutter 季度更新来啦 ！！！本次更新依然在 3.x 系列之下，也就是说还是持续的修复和优化，那么本次带来了哪些有意思的能力呢 :

- 优化了 Impeller 在 iOS 上的性能，同时 mac OS 已经可测试
- 折叠屏设备获得支持
- Material 3 持续增进支持，下一个版本讲默认 M3 选项
- 应用生命周期监听改进
- TwoDimensional，新的滚动机制
- New slivers，支持组合使用

## 新手推荐

### 🐎 [Applying metal shader to text in SwiftUI ](https://augmentedcode.io/2023/08/07/applying-metal-shader-to-text-in-swiftui/)

[@Cooper Chen](https://github.com/cjlcooper)：今年的 WWDC23 引入了用于将 shaders 着色器应用于 SwiftUI 视图的视图修改器，同时因为着色器还符合 ShapeStyle 协议，这意味着开发者可以直接将着色器传递给 foregroundStyle 视图修改器，然后 SwiftUI 就使用着色器计算视图的像素颜色值，本篇文章通过简单的例子，可以了解如何将着色器应用于文本，对于新入门相关开发的同学是一个不错的参考。

## 文章

### 🐕 [Swift ’ s closure capturing mechanics](https://www.swiftbysundell.com/articles/swifts-closure-capturing-mechanics/)

[@JonyFang](https://github.com/JonyFang)：尽管 Swift 的自动引用计数管理了内存，虽然我们常常听到过于简化的规则，比如“在闭包中始终使用弱引用”，但理解闭包的捕获方式以及如何引用对象和值很重要。日常开发中，需要深入了解这些机制，并根据实际情况进行合理应用。

1. 隐式捕获。在定义逃逸闭包时，它会隐式捕获内部引用的对象、值和函数。为了防止在稍后执行时被释放，这些闭包需要保持对所有依赖项的强引用。举例说明了如何使用 GCD 延迟显示 UIAlertController，并提到了这种捕获方式可能导致一些棘手的错误和内存问题。同时，也提到了对于已被从视图层次结构中移除的视图控制器，需要谨慎处理以避免问题。

2. 捕获列表。通过在闭包内部使用捕获列表，可以指定对象是以弱引用还是默认的强引用被捕获。通过弱引用捕获对象，可以避免潜在的保留循环问题，特别是在需要引用 `self` 时。通过示例展示了在闭包中使用捕获列表的具体应用场景，以及如何避免保留循环的问题。总体而言，捕获列表是解决闭包中引用问题的有效方式，能够更加精确地控制对象和值的引用关系。

3. 使用捕获列表避免保留循环。弱引用不是所有情况的最佳解决方案。不同情况下应谨慎考虑如何使用 self，以及闭包在内存中的寿命。在短暂的闭包中，如 UIView 动画，捕获 self 通常没问题，而且代码易读。但在闭包中访问实例方法和属性时，需要明确引用 self，以明确捕获决策。有些情况下需要长时间保留 self，例如当当前对象在闭包中的工作是必要的时。同时，捕获列表能够让我们直接捕获闭包的依赖项，而无需引用整个 self。在仅需要访问少数属性而不是整个 self 时非常有用。

4. 捕获值。值类型在闭包捕获中较复杂。值类型在闭包中被传递时是以副本的形式进行传递，这使得 Swift 的值类型非常强大，但在特定情况下可能会出现意外 case。例如，在给按钮分配处理闭包时，捕获 `sender` 和 `message` 属性可能会导致值的不一致。对于可变值，解决方法是在闭包中只捕获 `self`，然后将该值直接映射到发送方法。然而，对于常量，将这些属性添加到闭包的捕获列表中没有问题。

5. 无主引用（unowned）。闭包捕获中 unowned 引用与弱引用一样，也是通过捕获列表指定的，只能应用于引用类型。使用 unowned 与使用强制解包的可选项实际上会得到相同的结果，即将弱引用视为非可选项，但如果在引用释放后尝试访问它，会导致崩溃。使用 unowned 虽然让我们摆脱了可选项，有时可能非常方便，但它会在引用释放后引发崩溃，除非我们绝对确定给定的闭包在其中一个依赖项被释放后不会意外触发。然而，与其使用 unowned，我们可以通过断言来实现完全相同的效果。虽然这会导致一些额外的代码，但在失败时会提供更具可操作性的错误消息，并且不会在生产环境中引发崩溃。

理解闭包的捕获方式以及如何引用对象和值很重要，日常开发中需要合理应用。

### 🐕 [Deterministic builds with clang and lld](http://blog.llvm.org/2019/11/deterministic-builds-with-clang-and-lld.html)

[@老峰](https://github.com/Gesantung)：可重现构建（英语：Reproducible builds）也被称为确定性编译（英语：Deterministic compilation），即使用确定性编译编译的源代码在任何路径，时间，环境将始终输出相同的二进制文件。本文主要介绍了 Deterministic compilation 基本概念，以及如何使用 LLVM 创建确定性构建。

### 🐕 [How to Automate Memory Leak Detection in Your Swift Code with XCTest](https://qualitycoding.org/swift-memory-leak-detection-xctest/)

[@AidenRao](https://weibo.com/AidenRao)：这篇文章介绍了如何使用 XCTest 自动检测 Swift 代码中的内存泄露：使用 XCTestCase 中的 addTearDownBlock 方法，在测试方法结束时，通过断言检查对象是否正确释放。

### 🐎 [How to check if you use a required reason API](https://blog.eidinger.info/how-to-check-if-you-use-a-required-reason-api)

[@J_Knight_](https://github.com/knightsj)：我们在调用某些 API 的时候，需要我们向苹果官方告知使用的原因（比如一些可以用于标识设备的一些系统参数），本文作者把这类的 API 叫做 “ Required Reason API ”。作者简单介绍了这些 API 的类型，也提供了一个脚本用于在代码中查找出这类 API

## 代码

### **[SwingAnimation](https://github.com/TopWidgets/SwingAnimation)**：一份价值 500 的代码

[@卓同学](https://twitter.com/bestlacklock)：事情的起因是[自力 hzlzh]( https://twitter.com/hzlzh/status/1692205775928836405?s=20)在推特上“悬赏” 500 元想要知道小组件如何能做位移动画的秘密。苹果官方并不支持小组件做动画，因此要做到这个动画肯定是找到了一个特别的实现方式。悬赏发出来不到一天，就有一位开发者成功获得了悬赏。

我把这件事告诉了我们一位不愿意透露姓名的编辑后，这位编辑有着强烈的求知欲，于是也花了 500 获得了这个秘密。并在社交网络上分享：“昨天花了 500 买了一份代码，挺划算的”。与此同时我也在朋友圈说到：“彪子你太爱学习了”。

正当我们沉浸在一个价值 500 的秘密分享给另外一个人，等于白赚了 500 ，等于当时没花钱的喜悦的时候，某知名小组件开发者[树](https://twitter.com/_Octree)开源了这个方案。所以这是一份实打实价值 500 的代码了，如果有需要做小组件位移动画的欢迎前往了解学习。

## 内推

重新开始更新「iOS 靠谱内推专题」，整理了最近明确在招人的岗位，供大家参考

[杭州] 阿里巴巴 — 内容终端技术团队 — 手淘首页 & 信息流方向 — iOS/Android

[上海] - 完美世界 电竞 - iOS

[北京 / 杭州] - 抖音投屏 - Android/iOS

[北京] - 百度网盘 iOS/Android/FE/Server 研发工程师

[深圳 / 广州 / 北京 / 三亚] 字节跳动 - 剪映 - 招聘客户端开发

具体信息请移步：https://www.yuque.com/iosalliance/article/bhutav 进行查看（如有招聘需求请联系 iTDriverr）

## 关注我们

我们是「老司机技术周报」，一个持续追求精品 iOS 内容的技术公众号，欢迎关注。

**关注有礼，关注【老司机技术周报】，回复「2023」，领取 2023 及往年内参**

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