阅读原文,体验更佳!
老司机 iOS 周报,只为你呈现有价值的信息。
你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。
本周在周报公众号上我们推送了 2 篇 WWDC20 内参专栏内的文章,每篇都很精彩!
SiriKit 新变化:让 Intent 更强大
iOS 稳定性:使用 XCTIssue 分析诊断测试失败问题
@CrazyCoderShi: Flutter 自发布到目前的 1.22 版本,已经走过了两年多的时间,这段时间以来,Flutter 一直都是跨端开发的风口浪尖,这个时候很多人不禁要问:那么未来还是么 ?又该如何抉择 ?本文将给你这些问题的答案。
@Damien:objc_msgSend 方法是 Objective-C 的 Runtime 最核心的部分,你是否好奇底层的具体实现呢?本文的作者将会从汇编的角度把 objc_msgSend 的流程梳理一遍,包括 class 查找、缓存查找、缓存未命中的处理、taggedPointer 和 nil 处理。通过本文你会加深对象结构的布局认识以及对 arm64 汇编基础指令的学习也是一个很好的入门方式。
由 silan-liu 推荐
@Leo:函数耗时分析对性能优化非常有用。目前常用的方法有两种:类似 Time Profiler 的堆栈采样分析和 hook objc_msgSend 的 OC 方法级别耗时分析。
耗时统计的本质是在函数头尾插入统计代码,能在运行时做当然也可以在编译期,这篇文章非常详细地讲解了如何在编译期间通过 LLVM PASS 实现函数耗时统计,不仅能覆盖 OC ,还能覆盖 C、C++ 等其他语言。
@AidenRao:HTTP/2 的诞生,主要是通过多路复用技术,解决 HTTP/1.1 中的效率问题。但依旧存在很多不足,因为 HTTP/2 底层是采用 TCP 协议实现的,存在 TCP 队头阻塞,三次握手耗时过长问题。
所以,HTTP/2 推出没多久,业内就开始大力投入 HTTP/3 的研发与推广,HTTP/3 选择了一种新的技术方案,基于 UDP 协议改造的 QUIC (Quick UDP Internet Connections),作者会在后续的文章对 HTTP/3 进行详细介绍。
@JonyFang:我们应该都写过类似这样的简单代码:
0.1+0.2
与我们预期不同的是,它实际得到的结果是:
0.30000000000000004
那么我们为什么会得到这个结果?如何处理这类问题?关于这类常见浮点数问题的解答,我们可以通过这个网站来找到答案。如果读者有兴趣,也可以提供更深入的解释,说明为什么浮点数必须如此工作以及可能还会出现其它哪些问题。
@Parsifal:一款很好用的做 App 本地化的工具,UI 简明清晰,并且能自动识别工程内的所有本地化文件。
@老驴:日历,尤其是复杂的日历 UI 都是产品开发中费时费力的部分,很多时候,因为缩减开发周期,设计师也会选择跳过这部分转而使用原生的日历 App 来设计功能。这个 CalendarKit 就是由一位外国朋友开发维护的开源日历 UI 库,可以很方便的进行日历相关功能的集成。
由 理查德·托普奇( Richard Topchii ) 推荐
@Parsifal:如果你正在做 AR/VR 相关的开发,那么这个库一定对你很有帮助。RealityUI 提供了一系列的控件,让你可以像做 2D 应用一样开发 AR/VR 应用。
由 XanderXu 推荐,他长期研究 ARKit 相关技术,编写有 ARKit Tips 等多个专栏
@莲叔:Apple Developer 上推出的三个新的 Tech Talk,链接地址分别是:
10855 Explore UI animation hitches and the render loop[7]
10856 Find and fix hitches in the commit phase[8]
10857 Demystify and eliminate hitches in the render phase[9]
首先是第一讲,10855 介绍了在 iOS UI 开发中的 hitch(故障,卡顿) 的定义。之后介绍了 iOS 渲染的 3-阶段模型。进一步阐述了 hitch 出现的原因和类型,最后还给出了衡量 hitch 对于用户体验影响的指标。
接下来的两讲分别讨论了如何解决 commit 阶段和渲染阶段的耗时:
10856 首先介绍了 commit 阶段的定义, commit 阶段指的是当事件发生时, App 进程处理相关的 UI 更新到更新完成,提交到 Render 进程的时间。主要分为四个阶段: Layout、Display、Prepare、Commit。Layout 和 Display 阶段往往就对应我们 View 的 layoutSubview 和 drawrect, 是最容易导致卡顿的点。之后,视频结合一个具体的案例来介绍了如何使用新的 instruments 来定位 commit 阶段的 hitch, 最后给出了一些最佳实践来避免耗时。
10857 首先介绍了 render 阶段做的事情,然后引出了导致 render 阶段耗时的核心原因:离屏渲染。即 GPU 无法串行的执行所有绘制任务,而是需要中断主 pipeline 去先做一部分离屏渲染之后才能完成当前任务。之后介绍了如何使用 Xcode 的 View Hierarchy Debug 面板配合 Instrument 去找到当前介绍触发离屏渲染的元凶。最后,类似 10856, 本视频后续也给出了一些平时开发的最佳实践的建议。
这三讲的内容非常富有启发性,讲解 hitch 是一方面,更有价值的是借这个过程阐述了 iOS 的 UI 机制,让我们能够在做优化时候不仅能知其然,更能知其所以然。比如圆角、阴影到底为什么会影响帧率,Flutter 在 iOS 上对比原生的性能为什么相比 Android 差这么多这些问题,相信你看完都能有答案。
由 F010BE 推荐
虚位以待..
非常感谢以上赞助者的支持,如果你也有赞助我们的兴趣,欢迎添加微信 iTDriverr 哦~
老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。
如果你想找工作,点这里:https://www.yuque.com/iosalliance/article/bhutav
如果你想招人,点这里:https://www.yuque.com/iosalliance/article/ycyhf3
当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。
我们开通了公众号,每期发布时公众号(LSJCoding)会推送消息,欢迎关注。
同时也支持了 RSS 订阅:https://github.com/SwiftOldDriver/iOS-Weekly/releases.atom 。
???? 表示需某工具,???? 表示编辑推荐
预计阅读时间:???? 很快就能读完(1 - 10 mins);???? 中等 (10 - 20 mins);???? 慢(20+ mins)
[1]
arm64 objc_msgSend 源码解读: https://www.jianshu.com/p/1972010b88d7
[2]自定义 LLVM PASS 实现 函数耗时插桩统计: https://blog.0x1306a94.com/docs/llvm/ch01/01/
[3]What Every Computer Scientist Should Know About Floating-Point Arithmetic: https://floating-point-gui.de/
[4]Stringz iOS Apps Localization Editor: https://github.com/mohakapt/Stringz
[5]CalendarKit: https://github.com/richardtop/CalendarKit
[6]RealityUI: https://github.com/maxxfrazer/RealityUI
[7]10855 Explore UI animation hitches and the render loop: https://developer.apple.com/videos/play/tech-talks/10855
[8]10856 Find and fix hitches in the commit phase: https://developer.apple.com/videos/play/tech-talks/10856
[9]10857 Demystify and eliminate hitches in the render phase: https://developer.apple.com/videos/play/tech-talks/10857