摸鱼精选第 23 期

1. iOS SIGKILL 信号量崩溃抓取以及优化实践

其他信号不同,SIGKILL 不可被捕获,这是 Linux/Mach 内核的限制,为了让操作系统在程序无法响应的时候,可以从上一层控制进程的生命周期。自 iOS 13 后,引入了 MetricKit 框架,可以用来汇总和分析有关异常和崩溃诊断以及电源和性能。本文即介绍了如何使用 MetricKit 收集 SIGKILL 信号量、获取崩溃信息,基于 Code 的含义解析 SIGKILL 日志的过程。最后,也介绍了百度 App 常见的 SIGKILL 问题。

2. Swift Concurrency – Things They Don’t Tell You

Swift Concurrency 提供了一种非常好的编写异步代码的方法,同时它也被宣传为使用安全。然而不幸的是 Swift Concurrency 编程有很多陷阱,而且编译器不会检查所有东西

  • 如果使用 async 关键字,确保在后台线程上调用,否则需要添加 @mainactor 属性
  • Swift Actor 不能保证在使用过程中避免数据竞争,不保证异步方法在调用另一个方法之前会被完全处理
  • 避免将锁和信号量等经典的同步方法与 Swift Concurrency 混合使用
  • 设置 Task 优先级,避免在单个队列上分派所有内容
  • 避免在 Task 中进行繁重的同步工作,例如当需要像图像处理这样的繁重工作时,请使用自定义 DispatchQueue
  • 必要时请使用 await Task.yield() 允许更频繁地切换任务

3. Presenting Sheets: Item, or a Boolean Binding?

SwiftUI 显示 sheet 有两种形式,主要是第一个参数的类型不一样:

常见的是 Bool 类型的 @State.sheet(isPresented: $hidden) {}。 另一种是遵循 Identifiable 协议的类型:.sheet(item: $show) { item in }

4. Using MVVM Architecture with SwiftUI - Clean Architecture

作者尝试在 SwiftUI 中应用 MVVM 模式,跟 UIKit 中的应用有些许差别,可借鉴一下。

5. Which Collection?

集合(Collection)是编程语言常用的类型,Swift 集合是值类型的,对于复杂的集合数据,频繁拷贝可能会带来性能问题。本文通过一个数独算法,介绍如何对数组做优化,主要利用了 some 关键字配合 Swift 5.7 协议支持关联类型的新特性实现。想了解更多请参考 SE-0346

6. Swift 视频教程 ChaoCode

来自宝岛台湾的小姐姐 ChaoCode 从 Youtube 入驻 B 站,从基础的 Swift 语法到中级 Swift 内容、 SwiftUI、用 Swift 制作完整 App 等都有,比较适合入门学习 Swift,感兴趣的朋友可以关注。

7. 虚拟内存 & I/O & 零拷贝

内存管理也是操作系统的核心功能之一,本文主要讲解了 Linux 系统下内存管理技术,是一篇不错的科普文,主要包含以下四部分:

  • 虚拟内存: 地址翻译、高速缓存、加速翻译&优化页表
  • 内核空间 & 用户空间:内核态与用户态
  • IO:(同步)阻塞 IO、(同步)非阻塞 IO、IO 多路复用、网络 IO 模型、异步 IO
  • 零拷贝:传统 IO 流程、mmap + write、写时复制

8. How necessary are the programming fundamentals?

基础重要吗?原理有必要学吗?

每个人都有自己的观点,但我的观点跟作者一样,那些底层原理对业务上没有直接影响,不懂浏览器原理,照样可以把 Web 页面做的很漂亮。但是原理就跟内功一样,练到位了,手中剑就不一定是剑了,还可以是棍、枪、刀。

9. How Does Swift Concurrency Prevents Thread Explosions?

Task 的底层实现是线程池,最大线程数为 CPU 核数。

10. Towards the next generation of XNU memory safety: kalloc_type

内存安全漏洞是最常见,最广泛利用的漏洞问题,并且当今几乎所有流行的用户设备都依赖于用 C 和 C++ 等被认为 “内存不安全” 的编程语言编写的核心系统代码,本文来自 Apple 官方安全工程与架构团队文章,向大众展示了苹果在解决内存安全漏洞方面的努力,本文会从以下几个角度为我们完整的介绍了新的一代内存分配器 kalloc_type:

  • 对安全问题的介绍,包括目标、设计原理和必须克服的挑战。
  • kalloc_type 安全分配器的技术实现原理。
  • 安全分析和评估,包括优势和劣势。

本文是安全问题的系列文章内容的第一篇,感兴趣的同学可以订阅 Apple 官方 Blog。

11. Combining opaque return types with primary associated types

结合作者的另一篇文章看看:Using the ‘some’ and ‘any’ keywords to reference generic protocols in Swift 5.7

Swift 中 someany到底用哪个?尽量使用some

以前在使用 Combine 的时候,每个 Publisher 最后都要调用.eraseToAnyPublisher()转成 AnyPublisher。有了some关键字之后,就可以省略这一步了,直接返回some Publisher<User, Error>