# 老司机 iOS 周报 #223 | 2022-11-14

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

## 新闻

### [波报 | Pofat 的 Swift 中文电子报](https://pofat.substack.com)

[@kemchenj](https://kemchenj.github.io/)：波报是聚焦于 Swift 语言与其相关领域的技术周报，宗旨是为中文开发圈注入一些不同面向的资讯。

摘选的内容主要是国外 Swift 开发者社区的资讯，内容包含但不限于：

- Swift 和 LLVM 官方消息
- Swift 和 LLVM 论坛新鲜事
- Swift （或其它相关）的底层原理探讨
- Swift 程式语言设计的学习和思考

### [iOS 16.2 Beta 投屏崩溃](https://github.com/SwiftOldDriver/iOS-Weekly/issues/3673)

[@Leo](https://github.com/leomobiledeveloper)：iOS 16.2 Beta 系统投屏会出现 Invalid parameter not satisfying: outputDevice 崩溃，对投屏有强诉求的同学可以暂时别升级。

##  Developer - 设计开发加速器

### [Ask Apple November 14 to 18](https://developer.apple.com/events/ask-apple/)

继上次 10 月下旬的 Ask Apple 之后，苹果会再继续进行 2 轮新的 Ask Apple 活动，一轮是下周，另一轮是 12 月份。明年 WWDC23 之前，这可能是最后的两轮 Ask Apple 活动了。活动照旧需要提前注册并下载 Slack 。
这一次依旧会有中文集锦的频道，这个频道中除了回顾各个英文频道的精华内容之外，也鼓励中国开发者直接中文提问，而且会比上一轮放开更多的技术话题。

## 新手推荐

### 🐎 [Refactoring Swift: Best Practices to succeed](https://www.avanderlee.com/optimization/refactoring-swift-best-practices/)

[@极速男孩](https://github.com/ztlyyznf001)：重构是每个项目都会面临的问题，本文简单介绍了在代码重构时候索要注意的事项，以及如何借助 Xcode 中的比如 async/await ，to-do ，if let shorthand 等功能来对你的代码更容易去进行重构。

## 文章

### 🌟 🐕 [探秘越来越复杂的 ImageIO 框架](https://mp.weixin.qq.com/s/nbPIScJEZ3ReMSFuvNLkzQ)

[@JonyFang](https://github.com/JonyFang)：本篇会介绍，自 iOS 13 时代之后，苹果在 ImageIO 上做的一系列优化（“机制变化”），以及对开发者生态带来的影响。内容结构：
1. WebP/AVIF 新兴图像格式支持
	- WebP
	- AVIF
2. IOSurface 和硬件解码优化
	- 50% 内存开销的奥秘
	- IOSurface 和跨进程 Buffer
	- 开发者的痛，Public API
3. 不再安全的 ImageIO
	- 从一个崩溃说起
	- 崩溃的背后
	- Workaround 方案

早期的 ImageIO 和各种上层框架的设计，是针对 iPhone 的低内存的机型做深入优化，希望能尽量利用惰性解码，mmap 缓存，换取较低内存开消，并且对各种无硬件解码的开源格式完全不感兴趣。而最近几年，随着苹果芯片团队的努力，高内存，M1 的统一内存，以及高性能芯片的诞生，苹果已经有充足的能力能够通过软件解码，共享内存，越来越多硬件解码器技术来满足主流的多媒体图像支持，本身这是一件好事。

不过问题在于历史遗下来的 API，依旧保持了之前的设计缺陷，Apple 团队却一直在通过越来越 Trick 和 Hack 的方式解决问题，并没有给开发者可感知的新机制和手段来跟进优化（除开这一点吐槽，AppKit 上的 `NSImage` 的 `NSImageRep` 这种代理对象设计，比 `UIImage` 的私有类 `UIImageContent` 设计要适宜的多，也灵活的多）.

软硬件一体加之闭源，会导致开源社区的实现，永远无法及时跟上其一体的私有集成，最终会捆绑到开发者和用户（开发者越强依赖苹果 API 和 SDK，就会越强迫用户更新 OS 版本，进而捆绑硬件换代销售），这并不是一个好的现象🙃

### 🌟 🐕 [手把手教你写 Dart ffi](https://mp.weixin.qq.com/s/zmOH4p2932oaXzsF-MA5fA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 在 Flutter 开发中与 Native 层的 lib 交互 Channel 是最为大家所熟知的。但其性能历来饱受诟病，随后官方推出了更为高效的交互方式 ffi(foreign function interface)， ffi 不但更高效，且可以直接跟 C/C++ 之类更为底层的 lib 进行交互。本文采用 step by step 的方式示例如何使用 dart-ffi 进行编程，比较适合新手学习，小编强烈推荐。

### 🐕 [Result builders in Swift explained with code examples](https://www.avanderlee.com/swift/result-builders/)

[@Smallfly](https://github.com/iostalks)：Swift result builders 是一种组合构建代码的方式，在构建闭包内，多个同类型返回值的表达式，执行结果将会被隐式组合，返回一个集合类型的结果。SwiftUI 利用该特性实现了 `@ViewBuilder` 用于组织 View。

Result builders 特性能够用来设计 DSL，简化代码逻辑，增加可读性。本文通过自定义实现 `AutoLayoutBuilder` 来简化 AutoLayout 的使用，推荐感兴趣的同学阅读原文。

### 🐎 [When does a SwiftUI Environment get retained?](https://tiagolopes.blog/2022/11/01/when-does-a-swiftui-environment-get-retained/)

[@Cooper Chen](https://github.com/cjlcooper)：Environment 是 SwiftUI 的独特功能之一，这是我们以前在 UIKit 中所没有的。本文介绍了在 SwiftUI 的开发过程中应该如何对 Environment 进行内存管理。其中核心的观点如下：
- 处理任何不再使用的 SwiftUI 视图变量
- 处理不再使用的 UIHostingController 引用

同时需要注意以下方面的内存泄漏：
- SwiftUI 中使用的 UI 视图
- UIView 和 Environment 对象之间的引用
- UIViewController 显示 UIHostingController
- Environment 对象本身

### 🐕 [百度 APP iOS 端内存优化实践 - 内存管控方案](https://mp.weixin.qq.com/s/dETOGD3NYU2SdZhxGu0SZg)

[@AidenRao](https://weibo.com/AidenRao)：该方案重点解决的问题是在内存水位很高的情况下，保证 APP 稳定性又兼顾用户体验，延长 APP 使用时长同时避免 OOM。

- 针对不同机型制定了相应的内存水位可以更加从容地释放内存。本技术方案结合 Jetsam 机制和百度 APP 线上内存数据，制定了 iPhone 各机型允许使用的内存水位线，给业务和框架更大的空间释放和清理内存。
- 实时内存监控和精细化页面内存预测，在实时内存监控的基础上，开发了页面级的内存度量方案，可以估算出用户在新开一个页面内存涨幅多少，在未来一段时间内存会不会达到危险水位。
- 内存管控方案提供主动和被动通知两种方式获取内存水位状态，实现了各业务层根据手机内存情况实时降级，时效性更强，跟之前服务端降全量降级方案相比，更加灵活，性能更好。

### 🐕 [How Xcode 14 unintentionally increases app size ](https://www.emergetools.com/blog/posts/how-xcode14-unintentionally-increases-app-size)

[@莲叔](http://aaaron7.github.io/)：包 Size 是目前的移动开发者都不得不面对的一个问题。近期，Xcode 14 携带了众多新特性，其中一点值得开发者注意的就是将不会默认开启 bitcode，这将会导致潜在的包 size 增加。文章的作者团队进行了些初步的分析发现很多 APP 在切换使用 Xcode 14 打包以后都产生了 30%-60% 的 size 膨胀，这还是很惊人的。文章不仅分析了现状，还对膨胀的原因做了深入的分析。对于面临 Xcode 14 适配的开发者们不容错过。

### 🐎 [Should we manually call @StateObject initializer](https://sarunw.com/posts/manually-initialize-stateobject/)

[@Damien](https://github.com/ZengyiMa)：在 Swift 2.0 中苹果推出了属性包装器 @StateObject，当 View 发生更新时，@StateObject 修饰的对象不会进行销毁，但是能否在 init 方法方法中来手动调用 @StateObject 初始化器呢？答案是肯定，本文会进行深入的研究，并且指出了手动初始化 @StateObject 时应该注意的事项，对 @StateObject 感兴趣的同学不妨一读。

## 代码
### [CSProgress](https://github.com/CharlesJS/CSProgress)
[@享耳先森](https://github.com/iblacksun)：`CSProgress` 是一个高性能且易使用的 `NSProgress` 替代方案。 或许你对 `NSProgress` 并不熟悉，因为在业务开发中比较少用到，但还是建议你阅读下 `CSProgress` 项目的 READMEE，详细阐述了 NSProgress 性能问题及糟糕的 API 设计，对自己也是种警惕。

## 摸鱼周报

[@摸鱼周报 #74](https://mp.weixin.qq.com/s/lhhV0Qlc9NtFoM6nF7gZbA)：第 74 期摸鱼周报来了，看下本期概要有没有你感兴趣的内容：

* 本周学习：iOS NSDateFormatter 设置问题 & iOS 16 部分 pods 库签名问题
* 内容推荐：SPM 工程实践以及性能优化好文推荐
* 摸一下鱼：本期推荐一款跨平台的摸鱼网站、和两款坐姿监控 APP，摸鱼的时候也不要忘记保持正确坐姿；一个根据年历、地图、人物等生成文学图谱的网站；帮助从 intel 平缓过渡到苹果自研 M 系列芯片的软件检测 App。

## 内推

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