# 老司机 iOS 周报 #119 | 2020-07.13

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

**热烈欢迎周报团队的第 33 个编辑 - [@JonyFang](https://github.com/JonyFang)！他是 TIME 时间卡 App 的开发者，目前就职于本来生活网 P2C 项目组。**

## 新手推荐

### 🐎 [Benefits of using throwing functions (try) - Swift's most underrated feature?](https://swiftrocks.com/benefits-of-throwing-functions-try-swift-underrated-feature)

[@zvving](https://github.com/zvving)：Swift 新手面对 `do-try-catch` 常望而却步，调用时使用 `try?` 轻率处理，对外提供错误处理时一般使用 Result 返回错误，Throwing 几乎不是一个可选项。
本文作者认为 `do-try-catch` 可能是最被低估的 Swift 语言特性，并给出合理使用错误处理的建议：

- Result & Throwing 都可以作为函数返回错误处理的方式
    - 需要业务方显式处理 Error 时，推荐 Result
    - 业务方不关心错误，期望更外层处理时，推荐 Throwing
    - 一个方法内有多种类型错误需要返回时，只能选择 Throwing
- XCTestCase 对 Throwing 有很好的支持：Case 书写可以更聚焦于自身逻辑
- Result 与 Throwing 可以方便的相互转化

关于错误处理文中未提及的几点也值得留意：

- 虽然语法相似，但 `swift-try-catch-error`（错误处理） 与 `objc-try-catch-exception`（异常处理）并不相同
    - Objc 中异常处理因为性能和安全问题，不推荐使用
    - [Swift 中的错误处理](https://swiftgg.gitbook.io/swift/swift-jiao-cheng/17_error_handling#handling-errors)不涉及解析调用栈，性能好非常多，可以和 return 语句相媲美，推荐灵活选用
- Swift 中错误处理也要留意资源清理的工作，[推荐通过 defer 完成](https://swiftgg.gitbook.io/swift/swift-jiao-cheng/17_error_handling#specifying-cleanup-actions)

## 文章

### 🐕 🌟 [Flutter 上的内存泄漏监控](https://juejin.im/post/5ee748df5188251f8649a226)

[@CrazyCoderShi](https://github.com/CrazyCoderShi)：Flutter 所使用的 dart 语言具有垃圾回收机制，有垃圾回收就避免不了会内存泄漏, 内存泄漏的检测在各个端都是 Debug 的重头，iOS 侧的 Instruments , Android 侧的 LeakCanary ，本文将会带你实现一个 Flutter 可用的 LeakCanary。

### 🐕 🌟 [Apple Clip 技术详解](https://juejin.im/post/5ef41c9b6fb9a07e6143b0d0)

[@享耳先森](https://github.com/iblacksun)：苹果在 WWDC2020 上发布了 App Clip，本文从产品定位及实现细节上介绍了 App Clip 的方方面面，还与 `PWA`、`Instant Apps`、`小程序` 进行横向比对，推荐阅读。

### 🐕 [干货 | 携程 RN 渲染性能优化实践](https://mp.weixin.qq.com/s/3F8TOEdbiNX7SvXcy38Qrg)

[@looping](https://github.com/looping)：本文从理论方案、操作过程以及实用工具三个方面系统地总结介绍了携程在 React Native 渲染优化方面的实践经验，同时部分优化理论也同样适用于 H5 与 Native 平台。希望这篇文章能为对跨平台性能优化感兴趣的小伙伴带来一些实际的帮助与启发。

### 🐢 [iOS Memory 内存详解](https://mp.weixin.qq.com/s/YpJa3LeTFz9UFOUcs5Bitg)

[@含笑饮砒霜](https://weibo.com/chinafishnews/)：为了从根本上更好地理解和分析 iOS 系统上的内存特性，我们要了解一般操作系统的内存管理、iOS 系统内存和 app 的内存管理。本文主要内容的目录如下：

- 操作系统的内存机制
	- 冯.诺伊曼结构
	- 存储器的层次结构
	- CPU寻址方式
	- 虚拟内存
	- 内存分页

- iOS 内存机制
	
- iOS 系统内存占用
	- clean memory & dirty memory
	- compressed memory
	- 内存占用组成
	
- iOS app 内存管理
	-  iOS app 地址空间
	- 引用计数
	- 循环引用
	- weak 和 unowned
	- 不会导致循环引用的情况
	
- OOM 崩溃
	- jetsam机制
	- 如何检测OOM
	- OOM的常见情况
	
- 内存分析

### 🐕 [The Origins of Objective-C at PPI/Stepstone and Its Evolution at NeXT](https://dl.acm.org/doi/abs/10.1145/3386332?fbclid=IwAR0osl29GyKY9x3nFJE8bxYtDm5TnN4k0YOmqavny3uW5BaoL-Sk34xxOJs)

[@莲叔](http://aaaron7.github.io/)：OC 毫无疑问是移动互联网时代最有影响力的编程语言之一。我们都知道 OC 是 NeXT 主要编程语言，随着 NeXT 被苹果收购后就成为苹果主推的编程生态，但其实 OC 并不是 NeXT 发明的。OC 的前身叫 Object-Oriented Pre-Compiler(OOPC)，其作用是将 Smalltalk 语言转换为 C 语言。当时正处在“软件危机”的时代，关于如何更好的提升开发效率的研究如火如荼，OOPC 也是其中的一个研究项目。关于 OC 的发展值得回味的地方还有很多，有兴趣的同学可以看一下这篇由 OC 原作者和 NeXT 退休工程师共同撰写的关于 OC 发展历史的论文，非常详细的列举了不同时代的 OC 的迭代，可以看到不同的 feature 分别都是在什么样的背景下被发明出来的，对于未来怎么用好这些 feature 也非常有帮助。

### 🐕 [动手实现一个精简的动态布局 DSL](https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzAwMzc1NzU3Nw==&action=getalbum&album_id=1410655476664303616&subscene=159&subscene=158&scenenote=https%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzAwMzc1NzU3Nw%3D%3D%26mid%3D2247483732%26idx%3D1%26sn%3D0b3a6c988190e8e87e62f97abac03d88%26chksm%3D9b370232ac408b241791b1172b8d19c90cc9f5ecb218cad39759fcd447df811c8172497ed6ab%26scene%3D158%23rd#wechat_redirect)

[@老峰](https://github.com/gesantung)：AutoLayout 是目前 iOS 上常用的布局方案，而它的本质也是通过 Cassowary 求出元素具体的位置与大小。这个系列作者将基于 Flex 布局算法，打造一个基于 C++ 的跨平台布局 DSL，实现一个精简动态布局引擎。那怎么才能让数据动起来呢？React Native 是通过 javascript 来实现数据动态化的，而这个系列作者基于编译器前端技术实现一个自定义的脚本，利用 C++ 实现一个精简的脚本解释器完成数据动态化。Flex + Script 实现元素的布局计算，再通过原生渲染。对自定义动态布局 DSL 感兴趣的读者不妨阅读。

### 🐕 [Flutter 中的图文混排与原理解析 | 开发者说·DTalk](https://mp.weixin.qq.com/s/Scl4lP-sgesti74pZH4efg)

[@极速男孩](https://github.com/ztlyyznf001)：图文混排是在开发中比较常见的需求，在 flutter 中我们主要通过在 Text.rich 中添加 TextSpan 和 WidgetSpan 来实现，我们可以通过 WidgetSpan 来添加任何你想要的 Widget，包括 Image 和 Card 等。这篇文章主要通过分析 RichText 的源码，看到 flutter 如何通过 MultiChildRenderObjectElement 来管理当中的 Widget，并如何一步步的如何去绘制这些 Widget 的。

### 🐕 [iOS Jailbreak Principles 0x02 - codesign and amfid bypass](https://mp.weixin.qq.com/s/WyjWk9vrVAscDggX8GDNbQ)

本文是 **iOS Jailbreak Principles** 系列文章的最新一篇。前面的文章介绍了从内核漏洞到 tfp0，再到 rootfs 系统可读写。但到这为止，我们能做的事情还是比较有限的，为了做更多事情需要控制系统的 binary 或者分发自己的 binary 到系统，而为了做到这样，则必须绕过 codesign 机制。本文分析了 iOS 12 以后的 codesign 机制，随后从 amfid 入手分析了其绕过方案和实施过程。

### 🐎 [@StateObject 和 @ObservedObject 的区别和使用](https://onevcat.com/2020/06/stateobject/)

[@JonyFang](https://github.com/JonyFang)：今年 SwiftUI 补完了不少内容，其中状态管理方面是一个重要的话题。对于那些从外界接受 ObservableObject 的 View，究竟是使用 @ObservedObject 还是 @StateObject，需要根据情况和需要确定。像是那些存在于 NavigationLink 的 destination 中的 View，由于 SwiftUI 对它们的构建时机并没有做 lazy 处理，在处理它们时，需要格外小心。本篇博客文章展开介绍了 @StateObject 和 @ObservedObject 的区别和使用。

### 🐕 [iPadOS 鼠标的设计哲学](https://mp.weixin.qq.com/s/z1ZVYXjNGutoovth5-lL-Q)

[@张嘉夫](https://github.com/josephchang10)：作者王禹效在这篇文章里详细分析了 Apple 是如何为 iPadOS 设计鼠标功能的，包括与传统桌面操作系统鼠标在逻辑、显示和设计上的区别，以及 Apple 做出这些改变的原因。作者认为其实 Apple 不是什么魔法师，只是在设计时认真的去为用户做考量，愿意在这些别人不在意的细节上投资。一点点积累之后，就有了自己独特的用户体验。

### 🐎 [iOS Crash 分析攻略](https://mp.weixin.qq.com/s/hVj-j61Br3dox37SN79fDQ)

[@老驴](https://www.weibo.com/6090610445)：淘系技术出品的一篇关于 Crash 的文章。从基础到深入的介绍 Crash 日志渠道、Crash 捕获的原理、看懂 Crash 日志、Crash分析方法。这些东西可能在平时的开发中已经被 crash kit 工具所处理，很多时候大家并不会去深究其中的原理和含义。而这篇文章就很好的补充了这些。

其中的一些 debug 技巧很实用，在开发中也可以尝试着实践一下。总之，这是一篇不错的从入门到精通类的文章，值得一读。

## 音频

### 🐕 [网恋奇遇记 ：偶遇杀猪盘之我能反杀](https://www.xiaoyuzhoufm.com/episode/5efeafa36d76607427547473)

网络一线牵，珍惜这段缘；时间套路深，网恋需谨慎。

这期播客讲述了一个程序员使用网恋交友应用后遇到“爱情骗子”的故事，厉害的是小哥凭借执着的正义感最后成功追回骗款，还增加了额外收入。希望通过这期节目可以提高大家对网恋的警惕性。前 5 分钟主播们在日常寒暄，着急的朋友可以从 5 分钟后开始直接进入。

## 内推

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