# 老司机 iOS 周报 #7 | 2018-02-12

![ios-weekly](../assets/ios-weekly.png)

这周就是春节了，周报在春节期间不会更新，祝大家过个好年。

## 新闻

### [Swift 4.1 新增 `-Osize` 优化模式降低代码尺寸](https://swift.org/blog/osize/)

Swift 4.1 将随 iOS 11.3、Xcode 9.3 一起发布。`Optimization Level` 新增 `-Osize` 模式，降低编译后代码尺寸。按官方描述，启用 `-Osize` 后代码尺寸将降低 5%-30%，而性能影响可以忽略不计(小于 5%)。

另外，还从 `Optimization Level`  独立出 `Compilation Mode`，可选 `Single File` 和  `Whole Module`。

### [iOS 关键组件 `iBoot` 源代码泄露](https://mp.weixin.qq.com/s/QsQ49LkK_suB30O2AQWh9Q)

> 有匿名开发者在 GitHub 上传了 iOS 核心组件 `iBoot` 的源代码，`iBoot` 是 iOS 关键的源代码之一，它确保了操作系统的可信任启动，换句话说，它是加载 iOS 的程序，是开启 iPhone 运行的第一个进程，它加载并验证内核是否被苹果正确签名，然后执行，就像 iPhone 的 BIOS 一样。

[Apple 已确认这一事件](https://www.cnet.com/news/apple-calls-leaked-iphone-source-code-outdated/)并表示泄漏的是 iOS 9 的代码。

### [苹果公司与内蒙古签订协议，将在中国国内建设第二个数据中心](https://readhub.me/topic/1XVjDPeuSXk)

苹果公司将在内蒙古乌兰察布市，建设中国第二个数据中心，于 2020 年开始投入运营，继而形成“南贵北乌”两个数据中心的格局。

## 文章

### [iOS KVO crash 自修复技术实现与原理解析](https://zhuanlan.zhihu.com/p/33662572)

一年前网易杭研的博客[《大白健康系统--iOS APP 运行时 Crash 自动修复系统》](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/)引发了很多讨论。利用 runtime 动态特性，对一些常见 crash 进行保护：

- [unrecognized selector crash](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/#unrecognized%20selector)
- [KVO crash](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/#kvo)
- [NSNotification crash](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/#notification)
- [NSTimer crash](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/#NSTimer)
- [Container crash（数组越界，插 nil 等）](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/#container)
- [NSString crash （字符串操作的 crash）](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/#NSString)
- [Bad Access crash （野指针）](https://neyoufan.github.io/2017/01/13/ios/BayMax_HTSafetyGuard/#badaccess)

博客介绍了实现原理，未公布代码。现在根据小道消息，网易的这个库内部并未全面使用，开源计划已经搁置。社区有热心群众出于学习心态，按照文章思路写了一个类似的代码库：[BayMaxProtector](https://github.com/sunday1990/BayMaxProtector) 。

本文则针对如何防护 KVO crash 提出新的方案：通过建立哈希表保存观察者、keyPath 的信息，在对象 dealloc 时进行状态的更新。

### [[译] Swift 算法学院 - 查找数组中第 K 大值](https://juejin.im/post/5a732b4b5188257a5d2b0161)

介绍了查找数组中第 K 大值的算法。更多的基于 Swift 的算法例子可以看 [raywenderlich/swift-algorithm-club](https://github.com/raywenderlich/swift-algorithm-club)。

### [数据结构 & 算法 in Swift （二）：算法概述和排序算法](https://juejin.im/post/5a7b4101f265da4e7071b097)

本篇是《数据结构 & 算法 in Swift》系列连载的第二篇，首先简单地讲解了算法基础，包括算法的概念、时间复杂度与空间复杂度以及递归。然后结合 Swift 代码实现讲解了排序算法，包括选择排序、插入排序、归并排序和快速排序。

### [iOS 架构之 View 层的架构方案](https://mp.weixin.qq.com/s/t_IBkCClPBZFBPmtZT0WsQ)

在前两年 Casa 分享的 [iOS 应用架构谈 view 层的组织和调用方案](https://casatwy.com/iosying-yong-jia-gou-tan-viewceng-de-zu-zhi-he-diao-yong-fang-an.html) 之后，这是圈内现在新鲜出炉的又一篇 view 层架构分析文章。Casa 的文章最后站在更宏观的角度去提出 view 层架构模式需要遵循的"拆分三大心法"和"设计四大心法"。

这篇篇幅相对要少一些，该作者从「如何评价一个架构方案」-> 「MVC / MVVM / MVP / VIPER 等几种主流的架构模式简析」-> 「团队内最终的方案」，循序渐进地分享了适合自己团队的架构方案实践过程，对于初入架构设计的同学会相对更加友好一些。笔者建议先读懂这篇文章后，再细细咀嚼 Casa 的文章。

### [Crash 符号化](http://saitjr.com/tags/crash/)

作者一共写了三篇文章，从 **基本流程与相关命令** 到 **symbolicatecrash 源码浅析与优化** 以及最后的 **Mach-O 与 atos**，由浅入深的解释了 iOS Crash 从产生到符号化的整个过程。

### [Swift 中关于操作符的那些事儿](https://juejin.im/post/5a79552c5188257a7c6c3296)

这篇文章主要是介绍了一个处理 Error 的技巧，通过自定义操作符来简化错误处理的代码，没有复杂的逻辑和抽象，简单实用，强烈推荐👍

### [WebAssembly 能干什么？8 个 WebAssembly 应用案例](http://www.techug.com/post/webassembly-application-example.html)

WebAssembly 的特点是在浏览器里面他运行的比 js 快，虽然还是一个提案中的技术，但是各大浏览器厂商都已经跟进，因此有了很多 WebAssembly 实际应用案例，这篇文章就介绍了 8 个案例，从这里面的介绍可以看到 WebAssembly 普遍被应用到了这几个方向

- 将其他语言编译成 WebAssembly 做到可以在浏览器里运行；
- WebAssembly 在游戏引擎与图形渲染方面的运用；
- 是加速原本的 js 代码的运行。

### [[译]在 Git 中保护 iOS 项目的敏感信息](https://juejin.im/post/5a7ae875f265da4e983efac7)

如果要开源的代码涉及敏感信息，比如 API Key，HMAC secrets 或密码，那么比较好的方式是把它们放在新建的 xcconfig 文件里，Git 再忽略这些文件。
最后新建不把值包含进去的示例配置 xcconfig 文件。

其它开发者此时只需要将示例配置文件填值，再重命名一下即可轻松运行不包含敏感信息的项目。

### [Swift 4.1 improves Codable with keyDecodingStrategy](https://www.hackingwithswift.com/articles/52/swift-4-1-improves-codable-with-keydecodingstrategy)

Swift 4.0 中增加了 `Codable` 来方便的解析 Json，然而 Json 作为一个通用的数据格式通常用于和其他平台交互，其他平台的命名规范如果不是驼峰式就需要声明 json key 映射。4.1 中增加了 `keyEncodingStrategy` 配置两种常见命名规范的自动转换：

```swift
let jsonString = """
[{
    "name": "MacBook Pro",
    "screen_size": 15,
    "cpu_count": 4
    }]
"""

struct Mac: Codable {
    var name: String
    var screenSize: Int
    var cpuCount: Int
}

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToSnakeCase
let encoded = try encoder.encode(macs)

```

### Parallel programming with Swift [1. Basics](https://medium.com/flawless-app-stories/basics-of-parallel-programming-with-swift-93fee8425287) [2. Operation](https://medium.com/flawless-app-stories/parallel-programming-with-swift-operations-54cbefaf3cb0)

第一篇介绍了使用 Swift 进行并行编程时的多种方式，从 Process 到更高级的抽象 Operation，如何控制并发的顺序，锁和信号的使用。

第二篇主要是讲 Operation，包括 API，生命周期，依赖以及封装的介绍。

这一系列由浅入深，配图清晰，顺便推荐一下他们团队 [Flawless 的博客](https://medium.com/flawless-app-stories/tagged/ios)，里面有很多技术分享，质量都很高。

### [漫画：Git 二分 Debug，火速定位出错代码！](https://mp.weixin.qq.com/s/YhDsAHUuyKuRg-AfqvqUBw)

详细介绍了 Git 提供的**二分法**调试工具：git bisect。它可以按照我们选定的 commit 列表，进行二分分割，快速定位出出错的 commit。来帮我们缩小最小改动的代码，从而快速定位问题。作者还采用了漫画的形式，帮助读者加深印象。

## 工具

### [PodsUpdater--A macOS app which helps you manage dependency releases in your Podfile](https://github.com/kizitonwose/PodsUpdater)

一款协助你管理项目中 CocoaPods 依赖的小工具，能够清晰展示你项目内的依赖版本以及该依赖的最新版本，并提供自动适配兼容版本的功能。

分享笔者在使用过程中遇到一个坑，原因是某个比较旧的私有源配置的是 http 的 url，导致出现了`fatal: could not read Username for 'http://git.privatesource.com': Device not configured`，即该工具执行 `pod repo update` 的时候并没有权限去拉取你的私有源。解决方式也很简单，把旧的源里 url 修改成 ssh 的 url 即可，配置文件路径为 `/Users/your_username/.cocoapods/repos/-private-podrepo/.git/config`

### [CoreML 模型仓库](https://coreml.store/)

iOS11 所推出的 CoreML 让 App 开发者可以不用学习了解 Deep Learning ，不用亲自训练模型，拿训练好的模型就可以在 App 里快速使用。并且搭配开放了几个视频识别物体的模型 Object Detect，那么除了苹果开放的识别物体模型，现在还有哪些地方可以找到更多的训练好的 CoreML 模型呢？这里面介绍 3 个 Link，里面有很多训练好的有趣的模型，比如照片转油画 / 面部情绪识别 / 人物年龄猜测 / 文章分类 / 文字情绪识别等等，iOS 开发者的福音，可以拿来做一些有趣的个人 idea App

- https://coreml.store/
- https://github.com/likedan/Awesome-CoreML-Models
- https://github.com/SwiftBrain/awesome-CoreML-models

### [Carbon](https://dawnlabs.io/carbon)

Carbon 是一个可以在线将代码生成高逼格图片的工具，它具有以下特点：

- 可从 GitHub gist 直接导入；
- 高度自定义，可调整语法主题、窗体样式等参数；
- 分享便捷，一键发布 / 保存图片。

GitHub 地址：[https://github.com/dawnlabs/carbon](https://github.com/dawnlabs/carbon)

### [CTF Wiki](https://ctf-wiki.github.io/ctf-wiki/)

**CTF**（Capture The Flag，夺旗赛）起源于 1996 年 DEFCON 全球黑客大会，是网络安全技术人员之间的竞技比赛。

CTF Wiki 是一个自由的站点，主要包含了 CTF 中的基础知识、常见题型、解题思路以及常用工具等，可以帮助你更快地了解 CTF 竞赛以及网络安全相关知识，对安全领域相关知识感兴趣的同学千万不要错过。

GitHub 地址：[https://github.com/ctf-wiki/ctf-wiki](https://github.com/ctf-wiki/ctf-wiki)

## 本期编辑

[@没故事的卓同学](https://weibo.com/1926303682/profile)，[@四娘](https://kemchenj.github.io)，[@mmoaay](https://weibo.com/u/1302422271)，[@享耳先森](https://github.com/iblacksun)，[@EyreFree](https://weibo.com/eyrefree777)，[@Damonwong](https://weibo.com/damonone)，[@折腾范儿_味精](http://weibo.com/agvicking)，[@张嘉夫](https://weibo.com/2949394297)，[@AidenRao](https://weibo.com/AidenRao)，[@Parsifal](https://weibo.com/parsifalchang)

## 说明

🚧 表示需翻墙


