# 老司机 iOS 周报 #74 | 2019-07-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) 提出。

## 新闻

### [iOS 三大组织联名T恤，限时销售](https://m.tb.cn/h.e62VJCJ?sm=6bb793)

![](https://gd1.alicdn.com/imgextra/i2/38447709/O1CN01YCZQhR26oloQ4ciT0_!!38447709.png_400x400.jpg)

### [Design+Code 的 SwiftUI 教程限时优惠](https://h5.youzan.com/v2/goods/3eua57deaxury?dc_ps=2286991227876280320.200001&redirect_count=1)

![](https://images.xiaozhuanlan.com/photo/2019/d585de14b83c09b02dfc77251164fe52.png)

**扫码购买在五折基础上输入 iOSWeekly 优惠码再优惠 20 元，限时购买！！！**

## 新手推荐

### [Decode Row & Column](https://medium.com/@greg.perry/decode-row-column-8b88ad2d758c)

[@邦Ben](https://weibo.com)：如果你进行 Flutter 开发，那一定会接触到 Row 和 Column 这两个 Widget，这篇文章就非常详细的举例介绍了两个组件的里面的各个参数的使用。主要涉及的是 mainAxisAlignment，crossAxisAlignment 和 mainAxisSize。其中 mainAixsSize 为控制是不铺满剩余空间。

## 文章

### 🌟 🐕 [Revisit iOS Autorelease 之不经意间可能被影响的优化](https://satanwoo.github.io/2019/07/02/RevisitAutorelease/)

[@AidenRao](https://weibo.com/AidenRao)：非常硬核的一篇文章，编译器会判断方法的名是否以 alloc / new / copy / mutableCopy 开头，如果不是，则自动将返回的对象注册到 Autorelease Pool 中。且编译器会对 objc_autoreleaseReturnValue 和 objc_retainAutoreleasedReturnValue 进行基于 TLS(Thread Local Storage) 的判断优化，本质上并不会执行 autorelease。

但这个优化逻辑很有可能被我们不知情下编写的代码所改变，产生奇怪的问题。作者构建了一个 demo，从汇编入手，逐步分析，一段不起眼的代码是如何使 autorelease 优化失效，导致 MemoryGraph 中存在大量被 @autoreleasepool content 持有的数据，产生内存不释放问题（并非是内存泄漏，Leaks 是查不出来的）。

### 🌟 🐕 [全网最全 Flutter 与 React Native 深入对比分析](https://juejin.im/entry/5d0bad4c5188257152111ed8)

[@tom510230](https://xiaozhuanlan.com/u/6682065345)：本文作者从 环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来 等七个方面，对当前的 React Native 和 Flutter 进行全面的分析对比。实际上本篇文章有一些地方没有考虑到，这里补充一下相关的细节

1. 开发人员上手成本：毫无质疑，基于 JS 语法的 React Native 方案，开发者体验更好
2. 与 Native 的混编能力：这方面两个框架是五十步笑百步，都不能做到100%完美。从头条、闲鱼、携程、腾讯等大厂的经验来看，只要有人力做基础设施，这都不是事
3. 真·跨平台：去年 Airbnb 的文章让大家认识到，React Native 其实是个『假』跨平台方案，JS 部分需要各种判断容器的代码不说，很多时候还要纠结要不要使用原生插件（光看UI层）。Flutter 这方面相对来说，代码复用率会高很多。
4. 小程序方向：基于 React Native 的小程序方案已经有了，并且不少大厂都已经开发上线，基于 Flutte r的小程序方案大家还在讨论中，暂时未确定 Flutter 在小程序框架上面会比 React Native 优秀多少

### 🐕 [360 移动端性能监控实践 QDAS-APM](https://mp.weixin.qq.com/s/Vq0TDiLbexxBlqlf_lilnQ)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：App 的性能问题可能会严重影响用户体验，这些性能问题包括：崩溃、网络请求错误或超时、UI 响应速度慢、主线程卡顿、CPU 和内存使用高、耗电量大等等。通过对日常问题的归纳总结和学习业内相对完善的性能监控平台的实现原理，360 研发团队研发了一套移动端线上性能监控方案——QDAS-APM。文章按照功能详细介绍了实现细节和原理，目前已经实现了以下功能监控：

- 页面渲染时长
- 主线程卡顿 
- 网络错误
- FPS 
- 大文件存储
- CPU
- 内存使用
- Crash 
- 启动时长

参考文献
- [iOS性能监控方案](http://www.cocoachina.com/articles/19680)

### 🐕 [iOS 开发：『Blocks』详尽总结 （二）底层原理](https://juejin.im/post/5d14630ff265da1b725c1433)

[@老峰](https://github.com/GesanTung)：本文是作者 Blocks 系列文章的第二篇，比较详细的的介绍了 Blocks 相关的以下内容：

- Blocks 的实质
- Block 截获局部变量和特殊区域变量 
- Block 的存储区域
- Block 的循环引用

近些年 iOS 社区介绍 Blocks 底层原理的文章并不少，不了解相关知识的同学们可以看看。
推荐阅读
- 书籍：『Objective-C 高级编程 iOS 与OS X 多线程和内存管理』

###  🐕 [Using Sky Segmentation to create stunning background animations in iOS](https://medium.com/flawless-app-stories/using-sky-segmentation-to-create-stunning-background-animations-in-ios-4b4b2548061)

[@kyo](https://github.com/KyoLi)：如果有玩过摄影的同学可能会有过因为沉闷或者灰蒙蒙天空导致拍出来的照片不够理想，如果要拯救这张照片，换一下天空也是一种方式。于是，你可能点开 PhotoShop ，使用快速选择工具选中天空然后进行替换。之所以可以在 PS 中快速选择天空，是因为天空的颜色是均匀相似的，但有时候可能也需要多调整几下。想象一下，如果通过一款工具自动识别天空并进行替换，会不会是一件很有趣的事情？而这一款工具如今提供给了我们 iOS 开发者，它就是 Fritz 。它通过机器学习实现了天空分割这样一个计算机视觉任务，让我们开发者可以通过它去实现一些有趣的 idea 。笔者就很想用它来做一个小工具 app 以拯救笔者众多因天色不好而又懒得去一张张用 PS 替换的废片，有兴趣或者有更好想法的同学不妨用它来试试。[Fritz 项目地址](https://github.com/fritzlabs/fritz-ios-tutorials/tree/master/FritzSkyReplacementDemo)


### 🐕 [Rendering SwiftUI views to HTML](https://worthdoingbadly.com/swiftui-html/)

[@J_Knight_](https://github.com/knightsj)：本文作者开发了一个从 SwiftUI 到 HTML 的工具，目前该工具并没有支持所有的 SwiftUI 元素，作者只是将 SwiftUI tutorial 的 demo 的第一页渲染到了 HTML。

作者分享了在开发这个工具的过程中遇到的问题和解决办法以及一些收获，还同时在渲染方式上对比了 React 和 Flutter， 在语言层面上对比了 C++ 和 Java，而且对 Go 也做了一定的对比和分析。

推荐阅读：

- [SwiftRocks’s article on SwiftUI’s tricks](https://swiftrocks.com/inside-swiftui-compiler-magic.html)
- [kateinoigakukun’s article on how SwiftUI uses ABI stability for its magic](https://kateinoigakukun.hatenablog.com/entry/2019/06/09/081831)

### 🐕 [Uber 使用 QUIC 协议优化 App 网络性能](https://eng.uber.com/employing-quic-protocol/)
 
[@四娘](https://kemchenj.github.io)：Uber 由于使用场景的特殊性，所以对于网络延迟有比较严格的要求，延迟过久的情况经常被定位到系统的 TCP 实现上，所以他们最后决定改为使用 QUIC 协议。
QUIC 作为新一代 HTTP3 的底层协议，它在连接建立，拥堵控制等方面都比 TCP 更加先进，在这篇文章里他们详细介绍了两种方案的区别，QUIC 接入的过程以及接入后的网络延迟数据。

### 🐕 [Mocking a remote API in iOS](https://medium.com/swlh/mocking-a-remote-api-in-ios-4376b0cab962)

[@xiaofei86](https://weibo.com/xuyafei86)：本文作者使用简单的代码演示如何通过面向协议的方式 Mock 网络层数据，并说明 Mock 数据的重要性和好处（模拟网络延迟、网络错误，跳过登录等）。我们在实现自己的网络层时可以借鉴。

### 🌟 🐕 [知乎 iOS 客户端工程化工具 Venom](https://www.jianshu.com/p/b65d7bb7fa32)

[@红纸](https://github.com/nianran)：Venom 取名于《毒液》，是知乎客户端组解决组件化集成协作于一体的组件化管理体系，完整的 Venom 包含三个部分：

1. Venom macOS App：可视化管理组件的集成 GUI 工具
2. Venom 内核：基于 Cocoapods 的 DSL 扩展，在包装之上还有指定的扩展元素，最终还是会转化为 pod 相关的配置进行操作
3. Venom Server：远端 Server 管理配置等

其主要解决了以下几个组件化核心问题：

1. 工程构建：锁定了依赖 Gem 工具集版本和 Cocoapods 版本，保证里项目构建环境的统一，开发人员无需莞城工程配置问题
2. 二进制构建：Venom 可以看做为 pod 的超集，提供了，源码于静态库切换管理的相关功能，切换方案参考[知乎 iOS 基于 CocoaPods 实现的二进制化方案​](https://links.jianshu.com/go?to=https%3A%2F%2Fzhuanlan.zhihu.com%2Fp%2F44280283)。
3. 组件管理：定制化的本地组件开发（类比于 Cocoapods 中的 :path 情况下开发），其他仓库可以指定任意 tag/commit/branch（类比于 Cocoapods 中的 :git 情况下开发）
4. 调试工具：据文中描述，Venom 可以做到源码与静态库“共存”。这样的全局搜索就会包含全部源码不会含有遗漏的地方，另外打包使用 GCC 的 **fdebug-prefix-map=oldPath=newPath** 参数改写 Debug 模式下的源代码路径，达到静态库到源码的快速切换，达到编译调试源码的效果
5. 其他：此外还提供了一些其他的项目定制化功能，类似于“蜂鸟”的图片扫描工具，项目证书管理等

> 扩展阅读：[滴滴的 OneTool](https://mp.weixin.qq.com/s?__biz=MzUxMzcxMzE5Ng==&mid=2247488098&idx=1&sn=9cdf45a7b5ccf94eb6279856ec0dd4c5&chksm=f951a721ce262e3737f8aa99663c3b34f86420f11fb70ce6208eb96bcf6e10c6fbd00e4fb234&scene=27#wechat_redirect) 与 [京东的 iBiu](https://www.infoq.cn/article/jd-ios-component-management/)

### [做有温度又有生命的产品，专访色采团队](https://mp.weixin.qq.com/s/GvECV6nKYpfNJJ86EJ3dIg)

[JimQ](https://github.com/waz0820) 这是「Price Tag」对色采 APP 主创的一篇专访，谈了产品的整体概况、发展历程、产品初衷、产品特色、曾遇到的挑战、团队成员的协作方式，尤其 APP 属于三位全职工作者的业务爱好产出，谈到他们对「独立开发者」的理解，对独立开发感兴趣的小伙伴推荐阅读。

## 工具

### [Flutter Studio, Version 2](https://medium.com/@pmutisya/flutter-studio-version-2-41cce10fcf3d)

[@张嘉夫](https://github.com/josephchang10)：Flutter Studio web 应用的更新目标是更灵活、更完整、响应速度更快并且具有更高的精度。app 现在可以更好地适应不同尺寸的屏幕，在各类设备的各种方向上都精确显示，让你更一致、更专注地工作。此外 Flutter Studio 2 现在还可以生成完整的、可运行的代码和构建文件，并且具有更完整的 widget 集，甚至有一些从未在 flutter.io 的 widget 目录里出现过。

## 代码

### 🌟 [SwiftWebUI](https://github.com/swiftwebui/SwiftWebUI)

[@Damonwong](https://github.com/Damonvvong)：目前 SwiftUI 无疑已经成为 iOS 开发者必须要关注的技术了。但是 Apple Only 的跨平台理念还是让不少人有一些许失望。

但是，上周一个曾在 Apple 工作的开发者 [Helge Heß](https://github.com/helje5) 就打破了 Apple Only 的跨平台格局，在 SwiftUI 的基础之上，开发了一个 SwiftWebUI 框架，可以使用 Swift 直接写 Web 页面。

虽然，目前还处于 Demo 阶段，但是我觉得这是一个特别值得期待的技术。关于如何使用，这里有一篇介绍，感兴趣的可以阅读以下。[The missing ☑️: SwiftWebUI](http://www.alwaysrightinstitute.com/swiftwebui/?from=singlemessage&isappinstalled=0)

### [ValidatedPropertyKit](https://github.com/SvenTiigi/ValidatedPropertyKit)

[@JimQ](https://github.com/waz0820)：我们日常开发中，经常需要对定义的属性值加上约束条件，于是就需要重写这个属性的 `set`/`get` 方法，并加上各种约束逻辑。约束逻辑可能很简单（eg. 如果一个 string 属性 `isEmpty`（即长度为 0）则自动转换为 nil），但又很通用，或者对我们的业务来说很常用。这样的逻辑多了，我们的属性定义就变得冗长且重复。主说要有封装，于是就有了 `ValidatedPropertyKit`。它主要包含以下特性：

- 基于 @propertyWrapper 语法糖，让验证属性变得轻松而简洁。
- 内置了很多通用的验证，方便开箱即用。支持检测当前的值是否符合指定的验证，如果不符合可以回退到最后一次符合验证时的值，且支持给属性指定 keyPath 加验证。
- 支持使用逻辑运算符（即与或非）来组合验证。
- 可以根据自己的需求灵活地定制和配置，方便针对自己业务的常用逻辑进行统一封装。

相信受此启发，会有更多基于 @propertyWrapper 的库出现（比如与 diff 的结合），让我们的属性实现变得更加优雅、美好。

### [Burritos](https://github.com/guillermomuntaner/Burritos)

[@Parsifal](https://weibo.com/parsifalchang)：`@propertyWrapper` 作为 SwiftUI 广泛使用的特性（`@State`, `@Binding`, `@ObjectBinding`, `@EnvironmentObject`, 和 `@Environment` 等），已经在 WWDC19 中被大家所熟知。Burritos 则是利用这个特性，扩展了更多的 Property Wrapper 便于使用，如常见的 `@DynamicUIColor`、`@UserDefault` 和 `@DefaultValue` 等都能有效地减少我们的编码量。

> 扩展阅读：
> [Property Wrappers Proposal](https://github.com/DougGregor/swift-evolution/blob/property-wrappers/proposals/0258-property-wrappers.md)
> [SwiftUI 和 Swift 5.1 新特性(2) 属性代理Property Delegates](https://juejin.im/post/5cfcf51151882518e845c17c)
> 

### [TGIF-iMatrix/MXFlutter: 基于JS的高性能Flutter动态化框架](https://github.com/TGIF-iMatrix/MXFlutter)

[@tom510230](https://xiaozhuanlan.com/u/6682065345)：来自于手机 QQ 团队的开源代码，主要是解决 Flutter 开发中的痛点：不能动态化。原理大致就是：在上层用自己喜欢的开发语言进行 UI 控件的声明（通常也是脚本语言），然后丢给 Flutter 的渲染引擎进行渲染，从而达到了动态化开发的目的。

整体架构如下：
![整体架构](https://user-gold-cdn.xitu.io/2019/7/8/16bd01522f396359?w=876&h=460&f=png&s=282427)

> 扩展阅读：
> [基于JS的高性能Flutter动态化框架MXFlutter](https://user-gold-cdn.xitu.io/2019/6/25/16b8cec2d34ded87)

## 书

### [Using Combine](https://heckj.github.io/swiftui-notes/)

[@CrazyCoderShi](https://github.com/CrazyCoderShi): WWDC19 上大放异彩的 SwiftUI 相信大家都不陌生了，刚开始那几天，你几乎可以从各类开发者社区新闻中看到关于它的文章和评论之类，但是在其背后还有一个重要的彩蛋被忽视了，那就是 Combine 。Combine 是随着 SwiftUI 一起发布的一款函数响应式编程框架，如果你之前有接触过 RxSwift/ReactiveCocoa ，你就能明白 Combine 是个什么东东，他们有相似点，但 Combine 也有自己的独到之处，关键是由官方发布。[Using Combine](https://heckj.github.io/swiftui-notes/) 这本书可谓是手摸手教你使用 Combine, 更棒的是，书中很多例子是从 [swiftui-notes](https://github.com/heckj/swiftui-notes) 直接摘过来的，搭配食用效果更佳哟😄，本书开源的哟...

## 内推

### 字节跳动 2020 届提前批内推

**字节跳动**面向 2020 届毕业生的【秋招提前批】限时开启，**iOS/Android 客户端、前端，后端、测试开发等**岗位均开放名额，直走**内推通道**，提前拿 offer。

- 简历发送至：[zengming.0@bytedance.com](mailto:zengming.0@bytedance.com) （推荐标题：校招提前批-岗位-姓名-城市），如：校招提前批-iOS客户端-王富贵-北京
- **不影响**后续秋招再次投递，欢迎转发～
- 有效时间截止 2019.07.17

PS：王富贵表示：这是个很好的机会哟，走过路过不要错过 (～o￣3￣)～

### 常规内推

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

