# 老司机 iOS 周报 #110 | 2020.04.20

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

## 新闻

### [GitHub is now free for teams - The GitHub Blog](https://github.blog/2020-04-14-github-is-now-free-for-teams/?from=timeline&isappinstalled=0)

GitHub CEO Nat Friedman 宣布已面向全体 GitHub 用户和团队提供不限制协作人数的私有仓库，并宣称 GitHub 的全部核心功能现已对所有人免费提供。

去年 GitHub 宣布私有仓库免费，同时提供 3 个免费协作人数的名额，如果需要更多的协作人数，则需要付费。但从现在开始，任何团队都可以免费使用不限制协作人数的私有仓库。

## 新手推荐

### 🐢 [为什么使用汇编可以 Hook objc_msgSend（上）- 汇编基础](https://mp.weixin.qq.com/s/ty8Pt56EQ3sKiIfYypZ1fA)

[@J_Knight_](https://www.weibo.com/1929625262/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1/)：本文讲解了 ARM64 的汇编基础知识，其中包括：
- iOS 的内存分区及栈区；
- ARM64 中的寄存器及其含义；
- 开辟和释放栈空间以及什么是"爆栈"；
- 方法调用时的栈空间表现；
- 函数栈基于寄存器的回溯思路方案；
- stp 命令解释；

通过学习本文的这些知识可以为学习 Hook 的汇编方案做准备，而且对于想学习汇编的读者可以作为汇编的入门知识来学习。

## 文章

### 🐢[Contact Tracing](https://nshipster.com/contact-tracing/)

[@享耳先森](https://github.com/iblacksun)：为应对 COVID-19，苹果和谷歌宣布将在未来几个月内部署联系人追踪功能，声明中两家公司分享了这一技术的规范草案。在这篇文章中，[Matt](https://nshipster.com/authors/mattt/) 介绍了是苹果公司提出的 ContactTracing 框架，简单来说：ContactTracing 会为设备生成随机代码，利用蓝牙技术进行广播并记录所有近期接触过的设备。当某个用户被确诊了，卫生机构将请求得到 Ta 的随机码并进行登记，设备会间隔的向卫生机构进行比对，万一与名单中的设备接触过则提醒用户尽早需求医治。

### 🐕 [Why iOS Developers Feel Stuck In Their Careers & What To Do](https://medium.com/essential-developer-ios/why-ios-developers-feel-stuck-in-their-careers-what-to-do-d800a50470a2)

[@莲叔](http://aaaron7.github.io/)：看这个标题就知道这并不是一个技术文章。iOS 从出现到现在已经超过 10 年时间，已经并不算一门很新的技术了。同样的，iOS 工程师们也逐渐从新手到了老手，当然，也有一部分只是成了工作很多年的新手。但不管是谁，iOS 领域的同行似乎都持续在焦虑之中，从 16 年开始的创业浪潮退烧导致大量创业公司关门带来的移动就业萎缩，到现在的大数据时代，作为前端、客户端工程师所能为业务创造的价值似乎相对有限。作为结果，“iOS 没人要了”似乎一直是笼罩在大家头上的一片乌云。

从这篇文章来看，似乎国外的 iOS 同行也或多或少在面临相同的问题，感觉到了瓶颈。文章有两个核心观点：
1. 焦虑的本质是急功近利，对于获得回报所投入的时间不够实事求是，我们应该要关注 long term success，即短期会让你比较痛苦的方向，而不要醉心于 short term success，能够给你一些立竿见影的成就感那种。 其实也就是延迟满足。
2. 目前的就业市场反应， 软技能（Leadership、情商、沟通能力等)和技术能力本身同样重要。

其实观点不是新观点，但能 serious 的拿出来讨论，对于同行们肯定是好处，能够让大家更加重视这个问题。这里提一点，很多软技能：如 leadership，大家可能会觉得我不当 leader 是不是就不用 care，事实上不是，即便不带人工程师也可以通过体现 leadership 去正面的影响自己的合作方、客户和老板和自己的看法和态度，形成正向的循环。文章里面还有更多的相关讨论，有兴趣的同学可以看看。


### 🐢 [iOS 优化篇 - 启动优化之 Clang 插桩实现二进制重排](https://juejin.im/post/5e97c3c751882573b86f9d00)

[@looping](https://github.com/looping)：本文首先讲述了二进制重排的基本原理，然后尝试 clang 插桩（编译期静态插桩）的方式来解决抖音团队遗留下来的 [基于静态扫描+运行时 trace 的二进制重排方案不能进行 100% 的符号覆盖问题](https://mp.weixin.qq.com/s/Drmmx5JtjG3UtTFksL6Q8Q)，并通过实际工程来探索实现了启动时期所需的方法符号全覆盖的二进制重排方案。对通过二进制重排来优化应用启动感兴趣的同学可以好好学习研究一番了。

### [一个易迁移、兼容性高的 Flutter 富文本方案](https://mp.weixin.qq.com/s?__biz=MzU4MDUxOTI5NA==&mid=2247485159&idx=1&sn=76d1d0d4603a5a2ae0dfaa037cdb22c6&chksm=fd54d2f6ca235be009b651e8ad3efa1ec8fa3fa8dc6331cde86afb395388168e1bebf3455d87&token=761182588&lang=zh_CN#rd)

[@老驴](https://www.weibo.com/6090610445)：闲鱼团队不愧是最早实践 Flutter 的，踩了无数的坑，也总结了无数经验。本文就是闲鱼团队根据自己的需求，对 Flutter 中富文本的做了一套易迁移高兼容的方案。富本文也一直是跨平台方案的难点，有富文本方面需求的同学不妨来学习一下。

### [细化 Flutter List 内存回收，解决大 Cell 问题](https://mp.weixin.qq.com/s/Mcfj3lRR8VJACxsjjIiVsA)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：何谓大 Cell 问题？在基于 Native List 的渲染方案中，都会遇到大 Cell 问题。这个问题最直接的结果就是：导致内存过高。在 Flutter 里同样有这个问题，本质原因都是因为 List 进行回收的单位是 Cell，而不是 Cell 中的图片。本文详细介绍了手淘团队通过细化 Flutter List 的回收能力，在 Cell 回收的基础上，可以做到以图片为单位进行回收。

### [FluentDarkModeKit 微软的暗黑模式适配框架](https://juejin.im/post/5e82a0d0e51d4546b70d3c9e)

[@红纸](https://github.com/nianran)：FluentDarkModeKit 原名 DarkModeKit，本文是该库的源码分析文章。开发者通过方法设置 Light 跟 Dark 对应图片跟颜色。DarkMode 会使用中间类（DMDynamicImageProxy/DMDynamicColorProxy）将其存储，在使用过程中，将所有事件转发到对应模式下颜色或者图片。

> 推荐人：[ztlyyznf001](https://github.com/ztlyyznf001)

### 🐕 [Swift Logging](https://nshipster.com/swift-log/)

[@四娘](https://kemchenj.github.io/)：当 App 或者服务上线之后，出了问题最有效的 Debug 手段之一就是查看日志，那么该如何构建一套可靠的日志系统呢？这周 NSHisper 带来的是 swift-log 的介绍，推荐感兴趣的同学阅读。

### 🐕 [用Dart语言来写异步程序](https://mp.weixin.qq.com/s/wkNW6HrQmoHla--xrAPbBQ)

[@老峰](https://github.com/gesantung)：在 iOS 开发中用过 Promise 对 async await 异步编程概念并不陌生，本文作者详细介绍了 Dart 中的 Main Queue， Event Queue、Microtask Queue 异步执行顺序及相互关系。

### 🐕 [iOS 浅谈GPU及“App渲染流程”](https://juejin.im/post/5e80b49751882573be11b138)

[@邦Ben](https://weibo.com/linwenbang)：该文大致概括了 GPU 的工作原理，以及对比了 iOS，WebView，ReactNative，Flutter 的渲染流程，但是都比较概括，如果感兴趣的可以另外找文章继续深入了解。

### 🐕 [Flutter 究竟是如何渲染的？](https://juejin.im/post/5e931cd0e51d4546f5790806)

[@AidenRao](https://weibo.com/AidenRao)：本文从原理层面讲解 Flutter 渲染架构、渲染策略及渲染工作流水线。文章简单易懂，配合作者的另一篇文章 [iOS 浅谈GPU及“App渲染流程”](https://www.jianshu.com/p/8b0572f2c23a) 阅读，能快速的对 Flutter 的渲染原理有一定了解。

## 工具

### 🐕 [iOS线程数量监控工具](https://github.com/maniackk/KKThreadMonitor)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：一个用来监控整个 App 的线程数量和瞬间新建的线程数量的工具，当数量不合理的时候，就打印所有的线程堆栈，便于分析造成的原因。可参考阅读对应的[博客](https://juejin.im/post/5e92a113e51d4547134bdadb)，文中详细介绍了开发这个工具的核心逻辑。

### 🐕 [DocTest：将单元测试代码置于注释中](https://github.com/SwiftDocOrg/DocTest)

[@EyreFree](https://github.com/EyreFree)：DocTest 提供了一种在文档注释中添加 Swift 代码示例并和预期结果的方法，并且可以自动测试，就像单元测试一样。DocTest 通过与 Swift REPL（Read Eval Print Loop） 交互来实现测试代码的执行，依靠标准输入传递每个代码语句，并通过标准输出或标准错误读取其结果。示例如下：

```swift
/**
    Returns the sum of two integers.

    ```swift doctest
    add(1, 1) // => Int = 2
    ```
*/
func add(_ a: Int, _ b: Int) -> Int { ... }
```

### 🐎 [swift-outdated](https://github.com/kiliankoe/swift-outdated)
[@kemchenj](https://github.com/kemchenj)：在使用 Cocoapods 的时候我们每隔一段时间就会用 `pod outdated` 来查看哪些依赖可以升级了，但 Swift Package Manager 却没有这个功能，所以社区里就有人自己写了一个：

```shell
$ swift outdated

----------------------- ----------------- --------- --------
 Name                    Requirement       Current   Latest
----------------------- ----------------- --------- --------
 version                 2.0.0..<3.0.0     2.0.0     2.0.0
 files                   4.0.0..<4.1.0 ⬆️  4.0.2 ⬆️  4.1.1
 shellout                2.3.0..<3.0.0     2.3.0     2.3.0
----------------------- ----------------- --------- --------
```

## 代码

### 🐎 [MPITextKit](https://github.com/meitu/MPITextKit)
文本控件是我们日常开发使用最多的控件之一。系统的 UILabel 由于是在主线程渲染，在一些情况下不能满足性能要求，所以后续也有 YYText 这样的框架出现。不过由于 YYText 已经有一段时间没有维护了，这里推荐它的一个代替方案，MPITextKit 。MPITextKit 具有下面这些特性：

- 兼容 UILabel API
- 支持 AutoLayout
- 基于系统原生 TextKit, 所以能够使用所有系统文本属性，例如：NSAttachmentAttributeName, NSStrikethroughStyleAttributeName, NSUnderlineStyleAttributeName 等等
- 附件支持 UIImage、UIView、CALayer
- 支持截断文本设置
- 支持异步渲染
- 支持排斥路径
- 支持文本选中
- 支持文本布局 debug

### [SwiftyBeaver](https://github.com/SwiftyBeaver/SwiftyBeaver)

[@张嘉夫](https://github.com/josephchang10)：便捷、安全、多彩、灵活、轻量的日志输出类，支持 Swift 3, 4 & 5。在开发阶段支持 Xcode 控制台或直接输出 log 文件，发布后可以将日志加密并输出到 SwiftyBeaver 平台。此外，SwiftyBeaver 还提供了一个免费 [Mac App](https://swiftybeaver.com/)，用来浏览、搜索和过滤日志。

## 内推

### 杭州 - 阿里巴巴淘系技术基础平台：高级无线工程师（P6）/ 无线专家 (P7)

- iOS架构、底层方向
- iPad、新特性方向
- 业务开发和架构方向（iOS/Adnroid）

感兴趣的欢迎加微信了解具体要求。VX: damonwong2。也可以直接发送简历到 coderonevv@gmail.com

### 老司机推荐

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想**找工作**，点这里：https://www.yuque.com/iosalliance/article/bhutav

如果你想**招人**，点这里：https://www.yuque.com/iosalliance/article/ycyhf3

当然，也欢迎你关注我们每一期的周报，我们会在每期周报底部及时更新编辑内推岗位。

## 关注我们

我们开通了公众号，每期发布时公众号（OldDriverWeekly）会推送消息，欢迎关注。

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