老司机 iOS 周报,只为你呈现有价值的信息。
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
新闻
波报 | Pofat 的 Swift 中文电子报
@kemchenj:波报是聚焦于 Swift 语言与其相关领域的技术周报,宗旨是为中文开发圈注入一些不同面向的资讯。
摘选的内容主要是国外 Swift 开发者社区的资讯,内容包含但不限于:
- Swift 和 LLVM 官方消息
- Swift 和 LLVM 论坛新鲜事
- Swift (或其它相关)的底层原理探讨
- Swift 程式语言设计的学习和思考
iOS 16.2 Beta 投屏崩溃
@Leo:iOS 16.2 Beta 系统投屏会出现 Invalid parameter not satisfying: outputDevice 崩溃,对投屏有强诉求的同学可以暂时别升级。
Developer - 设计开发加速器
Ask Apple November 14 to 18
继上次 10 月下旬的 Ask Apple 之后,苹果会再继续进行 2 轮新的 Ask Apple 活动,一轮是下周,另一轮是 12 月份。明年 WWDC23 之前,这可能是最后的两轮 Ask Apple 活动了。活动照旧需要提前注册并下载 Slack 。 这一次依旧会有中文集锦的频道,这个频道中除了回顾各个英文频道的精华内容之外,也鼓励中国开发者直接中文提问,而且会比上一轮放开更多的技术话题。
新手推荐
🐎 Refactoring Swift: Best Practices to succeed
@极速男孩:重构是每个项目都会面临的问题,本文简单介绍了在代码重构时候索要注意的事项,以及如何借助 Xcode 中的比如 async/await ,to-do ,if let shorthand 等功能来对你的代码更容易去进行重构。
文章
🌟 🐕 探秘越来越复杂的 ImageIO 框架
@JonyFang:本篇会介绍,自 iOS 13 时代之后,苹果在 ImageIO 上做的一系列优化(“机制变化”),以及对开发者生态带来的影响。内容结构:
- WebP/AVIF 新兴图像格式支持
- WebP
- AVIF
- IOSurface 和硬件解码优化
- 50% 内存开销的奥秘
- IOSurface 和跨进程 Buffer
- 开发者的痛,Public API
- 不再安全的 ImageIO
- 从一个崩溃说起
- 崩溃的背后
- Workaround 方案
早期的 ImageIO 和各种上层框架的设计,是针对 iPhone 的低内存的机型做深入优化,希望能尽量利用惰性解码,mmap 缓存,换取较低内存开消,并且对各种无硬件解码的开源格式完全不感兴趣。而最近几年,随着苹果芯片团队的努力,高内存,M1 的统一内存,以及高性能芯片的诞生,苹果已经有充足的能力能够通过软件解码,共享内存,越来越多硬件解码器技术来满足主流的多媒体图像支持,本身这是一件好事。
不过问题在于历史遗下来的 API,依旧保持了之前的设计缺陷,Apple 团队却一直在通过越来越 Trick 和 Hack 的方式解决问题,并没有给开发者可感知的新机制和手段来跟进优化(除开这一点吐槽,AppKit 上的 NSImage
的 NSImageRep
这种代理对象设计,比 UIImage
的私有类 UIImageContent
设计要适宜的多,也灵活的多).
软硬件一体加之闭源,会导致开源社区的实现,永远无法及时跟上其一体的私有集成,最终会捆绑到开发者和用户(开发者越强依赖苹果 API 和 SDK,就会越强迫用户更新 OS 版本,进而捆绑硬件换代销售),这并不是一个好的现象🙃
🌟 🐕 手把手教你写 Dart ffi
@CrazyCoderShi: 在 Flutter 开发中与 Native 层的 lib 交互 Channel 是最为大家所熟知的。但其性能历来饱受诟病,随后官方推出了更为高效的交互方式 ffi(foreign function interface), ffi 不但更高效,且可以直接跟 C/C++ 之类更为底层的 lib 进行交互。本文采用 step by step 的方式示例如何使用 dart-ffi 进行编程,比较适合新手学习,小编强烈推荐。
🐕 Result builders in Swift explained with code examples
@Smallfly:Swift result builders 是一种组合构建代码的方式,在构建闭包内,多个同类型返回值的表达式,执行结果将会被隐式组合,返回一个集合类型的结果。SwiftUI 利用该特性实现了 @ViewBuilder
用于组织 View。
Result builders 特性能够用来设计 DSL,简化代码逻辑,增加可读性。本文通过自定义实现 AutoLayoutBuilder
来简化 AutoLayout 的使用,推荐感兴趣的同学阅读原文。
🐎 When does a SwiftUI Environment get retained?
@Cooper Chen:Environment 是 SwiftUI 的独特功能之一,这是我们以前在 UIKit 中所没有的。本文介绍了在 SwiftUI 的开发过程中应该如何对 Environment 进行内存管理。其中核心的观点如下:
- 处理任何不再使用的 SwiftUI 视图变量
- 处理不再使用的 UIHostingController 引用
同时需要注意以下方面的内存泄漏:
- SwiftUI 中使用的 UI 视图
- UIView 和 Environment 对象之间的引用
- UIViewController 显示 UIHostingController
- Environment 对象本身
🐕 百度 APP iOS 端内存优化实践 - 内存管控方案
@AidenRao:该方案重点解决的问题是在内存水位很高的情况下,保证 APP 稳定性又兼顾用户体验,延长 APP 使用时长同时避免 OOM。
- 针对不同机型制定了相应的内存水位可以更加从容地释放内存。本技术方案结合 Jetsam 机制和百度 APP 线上内存数据,制定了 iPhone 各机型允许使用的内存水位线,给业务和框架更大的空间释放和清理内存。
- 实时内存监控和精细化页面内存预测,在实时内存监控的基础上,开发了页面级的内存度量方案,可以估算出用户在新开一个页面内存涨幅多少,在未来一段时间内存会不会达到危险水位。
- 内存管控方案提供主动和被动通知两种方式获取内存水位状态,实现了各业务层根据手机内存情况实时降级,时效性更强,跟之前服务端降全量降级方案相比,更加灵活,性能更好。
🐕 How Xcode 14 unintentionally increases app size
@莲叔:包 Size 是目前的移动开发者都不得不面对的一个问题。近期,Xcode 14 携带了众多新特性,其中一点值得开发者注意的就是将不会默认开启 bitcode,这将会导致潜在的包 size 增加。文章的作者团队进行了些初步的分析发现很多 APP 在切换使用 Xcode 14 打包以后都产生了 30%-60% 的 size 膨胀,这还是很惊人的。文章不仅分析了现状,还对膨胀的原因做了深入的分析。对于面临 Xcode 14 适配的开发者们不容错过。
🐎 Should we manually call @StateObject initializer
@Damien:在 Swift 2.0 中苹果推出了属性包装器 @StateObject,当 View 发生更新时,@StateObject 修饰的对象不会进行销毁,但是能否在 init 方法方法中来手动调用 @StateObject 初始化器呢?答案是肯定,本文会进行深入的研究,并且指出了手动初始化 @StateObject 时应该注意的事项,对 @StateObject 感兴趣的同学不妨一读。
代码
CSProgress
@享耳先森:CSProgress
是一个高性能且易使用的 NSProgress
替代方案。 或许你对 NSProgress
并不熟悉,因为在业务开发中比较少用到,但还是建议你阅读下 CSProgress
项目的 READMEE,详细阐述了 NSProgress 性能问题及糟糕的 API 设计,对自己也是种警惕。
摸鱼周报
@摸鱼周报 #74:第 74 期摸鱼周报来了,看下本期概要有没有你感兴趣的内容:
- 本周学习:iOS NSDateFormatter 设置问题 & iOS 16 部分 pods 库签名问题
- 内容推荐:SPM 工程实践以及性能优化好文推荐
- 摸一下鱼:本期推荐一款跨平台的摸鱼网站、和两款坐姿监控 APP,摸鱼的时候也不要忘记保持正确坐姿;一个根据年历、地图、人物等生成文学图谱的网站;帮助从 intel 平缓过渡到苹果自研 M 系列芯片的软件检测 App。
内推
重新开始更新「iOS 靠谱内推专题」,整理了最近明确在招人的岗位,供大家参考。
具体信息请移步:www.yuque.com/iosalliance… 进行查看(如有招聘需求请联系 iTDriverr)
关注我们
我们是「老司机技术周报」,一个持续追求精品 iOS 内容的技术公众号,欢迎关注。
关注有礼,关注【老司机技术周报】,回复「2021」,领取 2017/2018/2019/2020 内参
同时也支持了 RSS 订阅:github.com/SwiftOldDri… 。
说明
🚧 表示需某工具,🌟 表示编辑推荐
预计阅读时间:🐎 很快就能读完(1 - 10 mins);🐕 中等 (10 - 20 mins);🐢 慢(20+ mins)