# 老司机 iOS 周报 #62 | 2019-04-08

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

欢迎我们的新编辑 [@CrazyCoderShi](https://github.com/CrazyCoderShi) 加入周报团队，[@CrazyCoderShi](https://github.com/CrazyCoderShi) 在跨端方案尤其是 Flutter 方向均有较深的研究，希望接下来能为大家带来更优质的相关内容~

## 新闻

### [Can we do something for 996 programmers in China?](https://zhuanlan.zhihu.com/p/61638339)

[996.ICU](https://996.icu/#/zh_CN) 在近来在国内互联网圈子里引发了不小的轰动，GitHub 上的仓库已经累计了 18w+ 的 star。而 Python 之父 Guido van Rossum 也同样关注着这个事件，早先就在推特上发声，而现在又在社区发起了一个讨论，希望能征集到一些切实可行的措施来改善这一现象。

## 新手推荐

### 🌟 [flutter_go](https://github.com/alibaba/flutter-go?utm_source=gold_browser_extension) / [flutter_ui](https://github.com/efoxTeam/flutter-ui)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：Flutter 自打发布以来一直是热门话题，对于新手入门来说，一个完整且规范的项目是不可多得的学习资料，[flutter_go](https://github.com/alibaba/flutter-go?utm_source=gold_browser_extension) 出自阿里拍卖前端团队，[flutter_ui](https://github.com/efoxTeam/flutter-ui) 出自 YY 团队，两者均提供了丰富的组件示例，代码规范完全遵循 [Effective-Dart](https://www.dartlang.org/guides/language/effective-dart/style) 规范，新手入门 flutter 必备，通过这两个项目您将学习到以下知识点:

- flutter 基础组件的使用方法
- flutter 动画应用( [flutter_ui](https://github.com/efoxTeam/flutter-ui) )
- 基于 [scoped_model](https://github.com/brianegan/scoped_model) 的 flutter 状态管理 ( [flutter_ui](https://github.com/efoxTeam/flutter-ui) )
- 如何组织一个多 tab 应用

### 🐕 [简单易懂 KVC 基础篇](https://juejin.im/post/5c948d6a6fb9a070eb267a08)

[@JimQ](https://github.com/waz0820)：一篇循序渐进地介绍 KVC 这门技术的文章。

- 首先，分普通和特殊用法两部分讲述了与 KVC 相关的一系列 API 接口，并给出了这些 API 的思维导图；
- 原理解析与实践，指出 KVC 协议中最关键的部分就是访问者搜索模式，并介绍了其中一种模式即可变数组的搜索模式；
- 最后，讨论了 KVC 与 KVO 的实现机制之间是否有相关性，认为 KVC 是 KVO 实现的基础。

## 文章

### 🌟 🐢 [小程序渲染架构设计](https://mp.weixin.qq.com/s/D_7yvtEdwq8NM_tcb1YjMw)

[@折腾范儿_味精](http://weibo.com/agvicking)：BATT，微信，支付宝，头条，百度，都纷纷推出了自己的小程序，小程序这个概念已经广泛的渗透到了各大公司各大平台。

- 小程序的架构有什么好处？为什么各大公司都倾向于用这样的小程序式的架构？
- 小程序的架构是什么样子？这一套架构实现上与 H5/RN/Flutter 他们之间有什么差异？

带着这些问题，来深入这篇文章，让我们从，用户的角度/平台的角度/架构与代码实现的角度，深入剖析一下“小程序”

### 🌟 🐕 [燃烧我的卡路里——Flutter 瘦内存、瘦包之图片渲染组件](https://mp.weixin.qq.com/s/QwNMm0P2z7RGJ_xzhto1RQ)

[@tom510230](https://xiaozhuanlan.com/u/6682065345)：本文介绍了闲鱼在做 Flutter 工程中具体遇到的性能优化场景，并且提高了解决思路

1. 内存问题 --- 连续 push flutter 界面内存累积

2. 安装包问题 --- 过渡时期两份重复资源文件

3. 寻址缓存问题 --- 原有的寻址缓存策略无法复用

4. 图片复用问题 --- Native 和 Flutter 重复下载相同图片

总体而言，Flutter 要想获得跟 native 差不多的性能，在不依赖原生 hybrid 组件的前提下，要对 Flutter Engine 做深度的定制，本文聚焦在了 OpenGL 渲染方面的性能改进。

### 🐢 [运行时 Hook 所有 Block 方法调用的技术实现](https://juejin.im/post/5ca0ca6e51882567e32fc44b)

[@含笑饮砒霜](http://chinafish.news)：项目中为了监控拦截或统计一些行为时，可能会用到 Hook 机制。可以使用 Method Swizzling 技术去 Hook 一个 OC 方法，可以通过修改导入函数地址表中的信息来 Hook  一个 C 函数，那如何 Hook 一个 Block 对象的函数调用呢？这需要解决如下问题：

1. 如何在运行时将所有的 Block 的 invoke 函数替换为一个统一的 Hook 函数

2. 这个统一的 Hook 函数如何调用原始 Block 的 invoke 函数

3. 如何构建这个统一的 Hook 函数

Block 对象也是一种 OC对象，通过探究，最终要执行替换的是 retain 方法， 至于为何以及如何替换 retain 方法，有兴趣的同学可以参考学习一下。


### 🐎 [跨平台技术演进](https://juejin.im/post/5ca1671651882567d41ebf6d)

[@aaaron7](https://weibo.com/aaaron7)：随着 Flutter 越来越流行，标志着无线端跨平台技术进入了第三个阶段，从最开始的 H5 + Native 的 hybrid 应用，到基于 DSL + 原生组件的 RN/Weex, 再到 DSL + 跨平台渲染组件的 Flutter。这些年跨平台技术的快速迭代，也促进了无线端技术栈和前端技术栈进行了各种各样的融合与尝试，也演化出类似 PWA，小程序这样独特应用场景的创新技术。本文作者总结了这一系列的技术，并针对性的分析了优缺点，算是不错的科普文章。深度一般，适合对相关技术不太了解的技术同学学习。

### 🐎 [Swift Tip: Collection Protocols](https://www.objc.io/blog/2019/03/26/collection-protocols/)

[@享耳先森](https://github.com/iblacksun)：在 Swift 中，有许多 `Collection` 相关的协议，每个都有自己的作用，了解这些协议各自的作用，在写算法时将非常有帮助。本文摘录自 [`Advanced Swift`](https://www.objc.io/books/advanced-swift/) 这本书，作者们正在更新 Swift 5 相关内容，如果你之前买过电子版的话，将能免费更新。

### 🐢 [A Glimpse into Generic Meta-Programming in Swift](https://wezzard.com/post/2019/03/a-glimpse-into-generic-meta-programming-in-swift-d2cd)

[@老峰](https://github.com/GesanTung)：VFL（Visual Format Language），是苹果公司为了简化 Autolayout 的编码而推出的抽象语言，其表达式通常是字符串，编译器无法在编译期验证表达式是否有误。基于这样的背景，本文作者以构建一个在编译期确保安全的 VFL 助手库为例，介绍了Swift 中的泛型元编程，点击这里查看本文 [源码](https://github.com/WeZZard/CTVFL)，这里有这篇文章的 [翻译](https://juejin.im/post/5ca09c696fb9a05e5f3cfe1f) 可供参考阅读。

### 🐢 [Introduction to Swift Keypaths](https://appventure.me/guides/keypaths/complete_book.html)

[@极速男孩](https://github.com/ztlyyznf001) ：在 Swift 中可以方便的通过 Keypath 对一个类进行类型安全的赋值和取值操作。本文首先介绍了 Swift 中的 Keypath 的基本用法和概念，然后给出一些实际的例子，并就如何在日常工作中使用 Keypath 给出一些建议和提示。

> 由 [yuhanle](https://github.com/yuhanle) 推荐

### 🐢 [The Pragmatic Guide to Scalable Swift Architecture for 2019](https://blog.usejournal.com/the-pragmatic-guide-to-scalable-swift-architecture-in-2019-dbe662f7f516)

[@四娘](https://kemchenj.github.io)：这算是一篇架构散文，作者在文章里通过一问一答的形式去阐述自己对于架构的理解：

1. 高薪程序员是如何在团队里逐步推进架构改造的？
2. 如何解决异步代码逻辑分散的问题的？
3. 如何在依赖注入时保障安全性和可复用性？
4. 如何通过状态和事件的解耦让 ViewController 的代码质量变得更高？
5. 如何解耦 ViewController 里的跳转逻辑？

## 设计

### 🐕 [Everything you need to know about Loading Animations](https://medium.com/flawless-app-stories/everything-you-need-to-know-about-loading-animations-10db7f9b61e)

[@张嘉夫](https://weibo.com/2949394297)：这篇文章对加载动画进行了深入的介绍，包括加载动画的发展历史、入门指南、何时应该简洁何时又应该充满细节、实用的工具和资源等等，可以帮助你创造更加优秀的用户体验。

## 工具

### [cocoapods-binary](https://github.com/leavez/cocoapods-binary)

[@小非86](https://weibo.com/xuyafei86)：在 CocoaPods 中，即使没有对项目中的 Pod 进行任何修改，Xcode 也仍然会重新编译 Pod。这在大型项目中是一件十分痛苦的事情。因此，Carthage 甚至将二进制管理作为其核心功能。但其实 CocoaPods 在官方指南的“插件”章节介绍一款可以支持二进制管理的 CocoaPods 插件 [CocoaPods Binary](https://guides.cocoapods.org/plugins/pre-compiling-dependencies.html)。

CocoaPods Binary 通过在 Pod 安装期间预编译你的 Pod，然后将二进制产物（例如：Framework 文件）添加到生成的 Pods 项目中，使 Xcode 没有重新编译代码的机会，以此实现二进制管理。

### [CIFilter.io (Core Image Filter Reference)](https://noahgilmore.com/blog/cifilterio/)

[@anotheren](https://anotheren.com)：`CIFilter` 是 `Core Image` 的一个重要组成部分，但是 Apple 提供的 [文档](https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIPerspectiveTransformWithExtent) 已经提示不再更新，缺少新加入系统的 `CIFilter` 的使用说明。CIFilter.io 提供了完整的列表搜索，以及其相关用法。甚至它还提供了一个 App 来展示各个 `CIFilter` 的实际使用效果，你可以在 [这里](https://github.com/noahsark769/cifilter.io) 找到相关源码。

## 代码

### 🌟 [Matrix for iOS/macOS](https://github.com/tencent/matrix/tree/master/matrix/matrix-iOS)

[@J_Knight_](https://github.com/knightsj)：Matrix for iOS/macOS 是一款微信团队研发并日常使用的性能探针工具，目前集成在 iOS 和 macOS 微信的 APM（Application Performance Manage）平台中使用。
Matrix for iOS/macOS 当前监控范围包括：崩溃、卡顿和爆内存，目前包含两款插件：

1. WCCrashBlockMonitorPlugin：捕获卡顿堆栈插件，基于 KSCrash 框架开发，具有如下特点：
    - 通过检查 Runloop 运行状态判断应用是否卡顿，同时支持 iOS/macOS 平台;
    - 具备耗时堆栈提取能力，可获取最近时间最耗时的主线程堆栈。
2. WCMemoryStatPlugin：内存监控插件，能够全面捕获应用出现爆内存时的堆栈以及内存分配的情况，具有如下特点：
    - 在应用运行期间获取对象存活以及相应的堆栈信息，在检测到应用爆内存时进行上报；
    - 使用平衡二叉树存储存活对象，使用 Hash Table 存储堆栈。
  

推荐阅读：
- [Matrix for iOS/macOS 正式开源了](https://mp.weixin.qq.com/s/ub4HF0PCGWoEveCvoGOG6A)
- [Matrix-iOS 卡顿监控](https://mp.weixin.qq.com/s/gPZnR7sF_22KSsqepohgNg)

### 🌟 [objc_msgSend_hook](https://github.com/czqasngit/objc_msgSend_hook)

[@红纸](https://github.com/nianran)：作者利用 [fishhook](https://github.com/facebook/fishhook) 原理巧妙的实现了对于 arm64 架构下 objc_msgSend 函数精简版的 Hook，代码量很少，可以有效工作且每一行代码都有注释（贴心~）。

> 由 [@首先很有趣](https://weibo.com/everettjf?is_hot=1) 推荐

### [RoughSwift](https://github.com/onmyway133/RoughSwift)

[@在等简历の邦Ben](http://weibo.com/linwenbang)：Swift 写的一个卡通手绘风格图形库，提供了所有基本类型（线，矩形，圆，圆弧等等），包括 SVG path。如果有同学想做点萌萌有趣的 APP 不妨考虑使用一下。

### [LVThemeKit](https://github.com/lvpengwei/LVThemeKit/blob/master/README.md)

[@JimQ](https://github.com/waz0820)：作者开发中用到多个区域切换多套皮肤的功能，之前版本中新增功能或主题时要新增许多冗余代码，针对此借助 OC 的泛型和 KVC 进行了一次重构，代码是重构后的实现。

> 由 [吕鹏伟](https://github.com/lvpengwei) 自荐

## 内推

老司机周报团队联合知识小集和 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）


