老司机 iOS 周报 #62 | 2019-04-08

杭镜
2023-12-01

老司机 iOS 周报,只为你呈现有价值的信息。

你也可以为这个项目出一份力,如果发现有价值的信息、文章、工具等可以到 Issues 里提给我们,我们会尽快处理。记得写上推荐的理由哦。有建议和意见也欢迎到 Issues 提出。

欢迎我们的新编辑 @CrazyCoderShi 加入周报团队,@CrazyCoderShi 在跨端方案尤其是 Flutter 方向均有较深的研究,希望接下来能为大家带来更优质的相关内容~

新闻

Can we do something for 996 programmers in China?

996.ICU 在近来在国内互联网圈子里引发了不小的轰动,GitHub 上的仓库已经累计了 18w+ 的 star。而 Python 之父 Guido van Rossum 也同样关注着这个事件,早先就在推特上发声,而现在又在社区发起了一个讨论,希望能征集到一些切实可行的措施来改善这一现象。

新手推荐

? flutter_go / flutter_ui

@CrazyCoderShi:Flutter 自打发布以来一直是热门话题,对于新手入门来说,一个完整且规范的项目是不可多得的学习资料,flutter_go 出自阿里拍卖前端团队,flutter_ui 出自 YY 团队,两者均提供了丰富的组件示例,代码规范完全遵循 Effective-Dart 规范,新手入门 flutter 必备,通过这两个项目您将学习到以下知识点:

  • flutter 基础组件的使用方法
  • flutter 动画应用( flutter_ui )
  • 基于 scoped_model 的 flutter 状态管理 ( flutter_ui )
  • 如何组织一个多 tab 应用

? 简单易懂 KVC 基础篇

@JimQ:一篇循序渐进地介绍 KVC 这门技术的文章。

  • 首先,分普通和特殊用法两部分讲述了与 KVC 相关的一系列 API 接口,并给出了这些 API 的思维导图;
  • 原理解析与实践,指出 KVC 协议中最关键的部分就是访问者搜索模式,并介绍了其中一种模式即可变数组的搜索模式;
  • 最后,讨论了 KVC 与 KVO 的实现机制之间是否有相关性,认为 KVC 是 KVO 实现的基础。

文章

? ? 小程序渲染架构设计

@折腾范儿_味精:BATT,微信,支付宝,头条,百度,都纷纷推出了自己的小程序,小程序这个概念已经广泛的渗透到了各大公司各大平台。

  • 小程序的架构有什么好处?为什么各大公司都倾向于用这样的小程序式的架构?
  • 小程序的架构是什么样子?这一套架构实现上与 H5/RN/Flutter 他们之间有什么差异?

带着这些问题,来深入这篇文章,让我们从,用户的角度/平台的角度/架构与代码实现的角度,深入剖析一下“小程序”

? ? 燃烧我的卡路里——Flutter 瘦内存、瘦包之图片渲染组件

@tom510230:本文介绍了闲鱼在做 Flutter 工程中具体遇到的性能优化场景,并且提高了解决思路

  1. 内存问题 --- 连续 push flutter 界面内存累积

  2. 安装包问题 --- 过渡时期两份重复资源文件

  3. 寻址缓存问题 --- 原有的寻址缓存策略无法复用

  4. 图片复用问题 --- Native 和 Flutter 重复下载相同图片

总体而言,Flutter 要想获得跟 native 差不多的性能,在不依赖原生 hybrid 组件的前提下,要对 Flutter Engine 做深度的定制,本文聚焦在了 OpenGL 渲染方面的性能改进。

? 运行时 Hook 所有 Block 方法调用的技术实现

@含笑饮砒霜:项目中为了监控拦截或统计一些行为时,可能会用到 Hook 机制。可以使用 Method Swizzling 技术去 Hook 一个 OC 方法,可以通过修改导入函数地址表中的信息来 Hook 一个 C 函数,那如何 Hook 一个 Block 对象的函数调用呢?这需要解决如下问题:

  1. 如何在运行时将所有的 Block 的 invoke 函数替换为一个统一的 Hook 函数

  2. 这个统一的 Hook 函数如何调用原始 Block 的 invoke 函数

  3. 如何构建这个统一的 Hook 函数

Block 对象也是一种 OC对象,通过探究,最终要执行替换的是 retain 方法, 至于为何以及如何替换 retain 方法,有兴趣的同学可以参考学习一下。

? 跨平台技术演进

@aaaron7:随着 Flutter 越来越流行,标志着无线端跨平台技术进入了第三个阶段,从最开始的 H5 + Native 的 hybrid 应用,到基于 DSL + 原生组件的 RN/Weex, 再到 DSL + 跨平台渲染组件的 Flutter。这些年跨平台技术的快速迭代,也促进了无线端技术栈和前端技术栈进行了各种各样的融合与尝试,也演化出类似 PWA,小程序这样独特应用场景的创新技术。本文作者总结了这一系列的技术,并针对性的分析了优缺点,算是不错的科普文章。深度一般,适合对相关技术不太了解的技术同学学习。

? Swift Tip: Collection Protocols

@享耳先森:在 Swift 中,有许多 Collection 相关的协议,每个都有自己的作用,了解这些协议各自的作用,在写算法时将非常有帮助。本文摘录自 Advanced Swift 这本书,作者们正在更新 Swift 5 相关内容,如果你之前买过电子版的话,将能免费更新。

? A Glimpse into Generic Meta-Programming in Swift

@老峰:VFL(Visual Format Language),是苹果公司为了简化 Autolayout 的编码而推出的抽象语言,其表达式通常是字符串,编译器无法在编译期验证表达式是否有误。基于这样的背景,本文作者以构建一个在编译期确保安全的 VFL 助手库为例,介绍了Swift 中的泛型元编程,点击这里查看本文 源码,这里有这篇文章的 翻译 可供参考阅读。

? Introduction to Swift Keypaths

@极速男孩 :在 Swift 中可以方便的通过 Keypath 对一个类进行类型安全的赋值和取值操作。本文首先介绍了 Swift 中的 Keypath 的基本用法和概念,然后给出一些实际的例子,并就如何在日常工作中使用 Keypath 给出一些建议和提示。

yuhanle 推荐

? The Pragmatic Guide to Scalable Swift Architecture for 2019

@四娘:这算是一篇架构散文,作者在文章里通过一问一答的形式去阐述自己对于架构的理解:

  1. 高薪程序员是如何在团队里逐步推进架构改造的?
  2. 如何解决异步代码逻辑分散的问题的?
  3. 如何在依赖注入时保障安全性和可复用性?
  4. 如何通过状态和事件的解耦让 ViewController 的代码质量变得更高?
  5. 如何解耦 ViewController 里的跳转逻辑?

设计

? Everything you need to know about Loading Animations

@张嘉夫:这篇文章对加载动画进行了深入的介绍,包括加载动画的发展历史、入门指南、何时应该简洁何时又应该充满细节、实用的工具和资源等等,可以帮助你创造更加优秀的用户体验。

工具

cocoapods-binary

@小非86:在 CocoaPods 中,即使没有对项目中的 Pod 进行任何修改,Xcode 也仍然会重新编译 Pod。这在大型项目中是一件十分痛苦的事情。因此,Carthage 甚至将二进制管理作为其核心功能。但其实 CocoaPods 在官方指南的“插件”章节介绍一款可以支持二进制管理的 CocoaPods 插件 CocoaPods Binary

CocoaPods Binary 通过在 Pod 安装期间预编译你的 Pod,然后将二进制产物(例如:Framework 文件)添加到生成的 Pods 项目中,使 Xcode 没有重新编译代码的机会,以此实现二进制管理。

CIFilter.io (Core Image Filter Reference)

@anotherenCIFilterCore Image 的一个重要组成部分,但是 Apple 提供的 文档 已经提示不再更新,缺少新加入系统的 CIFilter 的使用说明。CIFilter.io 提供了完整的列表搜索,以及其相关用法。甚至它还提供了一个 App 来展示各个 CIFilter 的实际使用效果,你可以在 这里 找到相关源码。

代码

? Matrix for iOS/macOS

@J_Knight_:Matrix for iOS/macOS 是一款微信团队研发并日常使用的性能探针工具,目前集成在 iOS 和 macOS 微信的 APM(Application Performance Manage)平台中使用。 Matrix for iOS/macOS 当前监控范围包括:崩溃、卡顿和爆内存,目前包含两款插件:

  1. WCCrashBlockMonitorPlugin:捕获卡顿堆栈插件,基于 KSCrash 框架开发,具有如下特点:
    • 通过检查 Runloop 运行状态判断应用是否卡顿,同时支持 iOS/macOS 平台;
    • 具备耗时堆栈提取能力,可获取最近时间最耗时的主线程堆栈。
  2. WCMemoryStatPlugin:内存监控插件,能够全面捕获应用出现爆内存时的堆栈以及内存分配的情况,具有如下特点:
    • 在应用运行期间获取对象存活以及相应的堆栈信息,在检测到应用爆内存时进行上报;
    • 使用平衡二叉树存储存活对象,使用 Hash Table 存储堆栈。

推荐阅读:

? objc_msgSend_hook

@红纸:作者利用 fishhook 原理巧妙的实现了对于 arm64 架构下 objc_msgSend 函数精简版的 Hook,代码量很少,可以有效工作且每一行代码都有注释(贴心~)。

@首先很有趣 推荐

RoughSwift

@在等简历の邦Ben:Swift 写的一个卡通手绘风格图形库,提供了所有基本类型(线,矩形,圆,圆弧等等),包括 SVG path。如果有同学想做点萌萌有趣的 APP 不妨考虑使用一下。

LVThemeKit

@JimQ:作者开发中用到多个区域切换多套皮肤的功能,之前版本中新增功能或主题时要新增许多冗余代码,针对此借助 OC 的泛型和 KVC 进行了一次重构,代码是重构后的实现。

吕鹏伟 自荐

内推

老司机周报团队联合知识小集和 SwiftGG 翻译组收录了一份靠谱的内推职位。

如果你想找工作,点这里:www.yuque.com/iosalliance…

如果你想招人,点这里:www.yuque.com/iosalliance…

当然,也欢迎你关注我们每一期的周报,我们会在每期周报底部及时更新编辑内推岗位。

关注我们

我们开通了公众号,每期发布时公众号(OldDriverWeekly)会推送消息,欢迎关注。

同时也支持了 RSS 订阅:github.com/SwiftOldDri…

说明

? 表示需翻墙,? 表示编辑推荐

预计阅读时间:? 很快就能读完(1 - 10 mins);? 中等 (10 - 20 mins);? 慢(20+ mins)

转载于:https://juejin.im/post/5caabf39f265da25145018e6

 类似资料: