# 老司机 iOS 周报 #187 | 2021-12-27

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

## 通知

[@Parsifal](https://github.com/ParsifalC)：这是今年的第 44 期周报，也是 2021 年最后一期周报，同时也是我作为周报主编的最后一期。2017 年底老卓创办了老司机技术周报，然后是 2018 年底我继任主编，成刊整整 4 年，经历过各种各样的事情，但周报都没有因为非节假日原因断更过，这是我们编辑组所有人都可以引以为傲的事情。而今我也要将主编这个身份交接给了我们下一任负责人 - Damon，也就是大家所熟悉的老王~老王也是编辑组的 OG，并且主导了编辑组与社区近两年的 WWDC 内参活动，过去也参加了编辑组很多运营工作，这次算是正式接棒上任了。后续周报的更新、纳新、对外合作以及各类内容发布等等运营相关事宜，都可以直接联系老王协商。我们一直说编辑组最大的资本就是我们 30 多位优秀的编辑，我很荣幸成为其中一员，即使往后不再参与运营工作，但我也会是周报最忠实的读者。感谢大家多年以来的支持，提前祝大家新年快乐啦！

## 🌟 [Tech Talks 2022 - 中文专场 0104](https://developer.apple.com/cn/accelerator/)

[@Parsifal](https://github.com/ParsifalC)：2022 年第一期 Tech Talks 中文专场来了！扫码即可报名~

### 使用 Group Activities 将共享群组体验引入您的 app

SharePlay 让您可以将您的 app 整合到 FaceTime 中，并以这种全新的方式将用户聚集起来。通过 Group Activities API，您可以比以往更加容易地将您的 app 中的电影、电视、音乐和其他共享媒体带入到人们已经在用来相互联系的空间。您可以了解如何提供全新的卓越用户体验，以及用户之间的推荐为您的 app 带来的自然增长。
名额有限。请在 2022 年 1 月 3 日前报名参加。

![image](https://user-images.githubusercontent.com/7930911/147406439-3d5a3463-84ed-4f50-90ee-da08f32d9e49.png)

## 新闻

### 🐎 [Log4j Xcode vulnerability](https://developer.apple.com/forums/thread/696785)
[@Smallfly](https://github.com/iostalks)：近期 Java 日志库 Log4j 漏洞影响了很多国内外主流的大平台，有用户在苹果论坛上指出，Xcode 在上传应用到 App Store 时使用了 Java 运行环境，疑似存在风险。苹果团队回应 Xcode 确实包含 Log4j 副本，Xcode 13.2.1 会自动更新到修复版本。

建议及时升级 Xcode。

## 文章

### 🌟 🐕 [Flutter疑难杂症系列：实现支持复杂需求的列表](https://mp.weixin.qq.com/s/CtcxDtTgcEh0L77Z2g9HFg)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): 列表页面在移动端开发可谓是一个必然面对的场景，复杂业务下的列表优化也是个老生常谈的话题，在 Flutter 中也是如此，本文是由字节跳动基础架构团队奉献，详细讲解了 Flutter 中如何应对复杂需求下的列表页，从原理到实践，到性能分析，再到功能扩展，一步步抽丝剥茧，值得每一位 Flutter 开发者细读，小编强烈推荐。

### 🌟 🐕 [Swift代码优化指南 | 如何最大化实现性能提升？](https://mp.weixin.qq.com/s/xGeLeqcXBeBw1zMPqBZKYA)

[@JonyFang](https://github.com/JonyFang)：本篇从语法角度优化代码，长远来看有益于养成良好的代码习惯，某种程度上从根源减少错误的产生。详细内容：
1. 编译速度优化
	- 费时类型判断；
	- 现实运用中的取舍；
2. 内存分配与占用
	- 关于 struct 的使用；
	- 用轻便的 Enum 替代 String；
	- 优化集合类型（内存分配策略、预分配内存、惰性序列）；
	- 减少不必要的桥接（ContiguousArray 替换 NSArray）；
	- 善用写时复制；
3. 运行时速度优化
	- 介绍三种函数派发；
	- 使用 final、private 优化派发方式；


### 🐕 [错误处理原则及其在Swift中的应用](https://mp.weixin.qq.com/s/DJKuCXzqxBg7LPmtPMgglw)

[@Barney](https://github.com/BarneyZhaoooo)：本文讨论了容易被大家忽视的错误处理，以及一些Swift中的应用。

- 错误处理的目标
- 错误处理的方案
- 异步函数的错误处理
- Swift标准库的行为

### 🐢 [A roadmap for improving Swift performance predictability: ARC improvements and ownership control](https://forums.swift.org/t/a-roadmap-for-improving-swift-performance-predictability-arc-improvements-and-ownership-control/54206)

[@ChengzhiHuang](https://github.com/ChengzhiHuang)：Swift 的开发者为我们带来了基于 ARC 内存管理的新特性 roadmap ，总体思路是在不影响主要代码逻辑阅读的前提下，在参数定义时增加特定的一些关键字来优化标明持有关系，使 debug/release 下的表现一致，辅以编译器的强提示来保证安全性；相较 C++ 严格的作用域模型，Swift 会略微宽松一些，同时也能避免在 deinit 时有先后顺序的依赖导致的问题。特别强调，目前只是 roadmap ，后续可能还会有变更。同时对目前 debug/release 释放时机不明确可能导致的问题进行了举例：例如在 deinit 时会调用 free ，而 free 对 errno 有影响，如果判定对象能够提前被释放，就有可能导致程序在 debug/release 下有不同的表现。

主要内容如下：
- 通过 move() 方法，在函数内显式转移控制权，这样原本的变量就不再被持有，那就被编译器认为可以被释放，可以避免 Copy-on-write 的多余操作。同时在函数内期望最后的一次使用该变量时，也可以调用此方法，防止该变量后续再被调用。
- 通过在函数声明时对参数标注 consuming/nonconsuming 来传达持有关系。
- 通过将 getter/setter 函数替换为 read/modify 来避免对 Array/Dictionary/Set 等类型的无用 Copy-on-write 。
- 通过对参数标注 @noImplicitCopy 来保证：在函数体内，如果传递该参数到标明 consuming 的方法时，则需要显式调用 copy 方法，来确认参数的所有权。如果不显式调用，则会在编译期报错。
- 对参数也可使用 @nonescaping 进行标注。
- 上述 @nonescaping/@noImplicitCopy 的变量统称为 move-only 类型，会对参数列表中包含 move-only 类型的 API 进行性能优化。

### 🐕 [Introducing Swift for Visual Studio Code](https://forums.swift.org/t/introducing-swift-for-visual-studio-code/54246)

[@老峰](https://github.com/gesantung)：本文介绍了 VSCode Swift 扩展，该扩展可以提供 VSCode 下 Swift 开发，可以方便的处理 Vapor 项目，值得注意的是这是一个 0.1.0 版本，因此它的功能不完整，主要包括以下功能：
- 自动创建任务
- 包依赖视图
- 代码补全
- 跳转到定义、查看定义、查找所有引用、符号搜索
- 自动生成用于调试的启动配置

## 摸鱼周报

[@摸鱼周报 #39](https://mp.weixin.qq.com/s/DolkTjL6d-KkvFftd2RLUQ)：第三十九期摸鱼周报来了，一起来看下本期概要：

* Tips：混编｜为 Swift 改进 Objective-C API。
* 面试模块：HTTPS 证书有效性的验证过程。
* 优秀博客：Core Data、Realm、MMKV 这几个库相关的一些介绍。
* 学习资料：一个学习正则表达式的网站。
* 开发工具：一个安装 Xcode 的 CLI 工具 `xcinfo`，一款开源的 Markdown 编辑工具 Mark Text。

本期访谈对象是老司机周报的主编：Parsifal。本次访谈主题分两部分，一部分是老司机周报的发展故事和他的行业观察，另一部分是他对开发者的一些建议。详情可以点击：[人物访谈 | 老司机周报主编 Parsifal 专访](https://mp.weixin.qq.com/s/HWbPbPBPYgFJsM-oc_4tvw)

## 工具

### [ipatool](https://github.com/majd/ipatool)

[@Parsifal](https://github.com/ParsifalC)：一款通过终端下载 App Store  IPA 的脚本工具，两行命令即可下载已经上架的 App 了（前提是你已经在手机上下载过该 App，即这个工具只是从你「已下载 App」里同步 IPA）。另外需要注意的是，如果账号开启了两步验证，则需要多试一次。第一次尝试会触发两步验证的验证码，第二次继续尝试并且将第一步获取到的验证码直接拼接到你账号密码后面即可。

```shell
#先执行一次
ipatool download -b com.apple.testflight -e olddriver@gmail.com -p YourPassword$110
==> ℹ️	[Info] Querying the iTunes Store for 'com.apple.testflight' in country 'US'...
==> ℹ️	[Info] Authenticating with the App Store...
==> ❌	[Error] An unknown error has occurred.

#拿到上一次触发的验证码，比如123456，拼接到密码后面
ipatool download -b com.apple.testflight -e olddriver@gmail.com -p YourPassword$110123456
==> ℹ️	[Info] Querying the iTunes Store for 'com.apple.testflight' in country 'US'...
==> ℹ️	[Info] Authenticating with the App Store...
==> ℹ️	[Info] Authenticated as 'Old Driver'.
==> ℹ️	[Info] Requesting a signed copy of '899247664' from the App Store...
==> ℹ️	[Info] Downloading app package... [100%]
==> ℹ️	[Info] Saved app package to com.apple.testflight_899247664_v1.5.0_465.ipa.
==> ℹ️	[Info] Applying patches...
==> ℹ️	[Info] Done.
```

## 书

### [阅读亚马逊逆向工作法的几点收益](https://mp.weixin.qq.com/s/-FHtH2C8f7oKLh3QJ9DFWw)

@叶孤城：推荐一本书叫做《亚马逊逆向工作法》，我买来看了一遍，受益匪浅。少有的在讲管理时，实操性极强，而不谈玄学的书。

## 音视频

### 🐢  [编码人声：新人该怎样入坑开源项目](https://dao.fm/2021/12/09/vol-333-编码人声：新人该怎样入坑开源项目？/)

 [@含笑饮砒霜](https://weibo.com/chinafishnews/)：开源对普通程序猿来说似乎是很遥远的事情，这期播客请到了几位开源领域的大咖，聊一聊如何开始你的开源之旅。本期播客的主要内容：
- 嘉宾参与开源项目的心路历程
- 开源的经济价值和社会价值
- 如何开始参与一个开源项目
- 只有程序员才能参与开源么
- 开源对企业的价值在哪里
- Github等开源平台的生态和挑战
- 自海外诞生的开源文化，在中国会如何


## 赞助者

虚位以待..

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