追踪 Objective-C Block 代码定义的位置
之前写了一篇文章《追踪 Objective-C 方法中的 Block 参数对象》,利用 BlockHook 和 Objective-C 的动态特性实现对 block 对象执行和销毁的追踪。本文在此基础上,通过 Mach-O 文件格式获取 Mangle Name 并根据 Clang 源码实现对其解析,探寻如何追踪 block 代码定义的位置。
主要代码已经整合到 BlockHook 1.0.2 版本中。
之前写了一篇文章《追踪 Objective-C 方法中的 Block 参数对象》,利用 BlockHook 和 Objective-C 的动态特性实现对 block 对象执行和销毁的追踪。本文在此基础上,通过 Mach-O 文件格式获取 Mangle Name 并根据 Clang 源码实现对其解析,探寻如何追踪 block 代码定义的位置。
主要代码已经整合到 BlockHook 1.0.2 版本中。
MessageThrottle 是我开发的Objective-C 节流限频组件,其原理基于 Hook 消息转发流程,所以相比直接调用方法,会有一些性能上的损耗。本篇文章记录了对其性能进行测试的结果,并通过使用 NSMapTable
改进存储结构和缓存来对性能进行大幅度的优化。
这是你从未体验过的船新版本。
产品经理要求做个能展示进度的分段彩色外环,大概长这样:
花了两天左右来实现和优化,记录下踩坑经历。
组件已经开源,取个名字叫 YXYDashLayer
吧:https://github.com/yulingtianxia/YXYDashLayer
很多方法最后一个参数是类似于 completionBlock
这种回调,然而有些 API 实现一些异常逻辑时会忘记调用传入的 Block 参数(当然这肯定是 bug 啦),或者存在多次调用。在调试的时候可能会碰到这种大坑,需要追踪下 Block 参数何时调用了,甚至是否调用过。如果不方便直接在 Block 实现中加代码,或者没有源码的情况下,就需要无侵入式地追踪 Block 参数对象。
BlockTracker 可以追踪方法调用时传入的 Block 类型的参数的执行和销毁。基于 BlockHook 实现。本文讲述了它的使用方法和实现原理。
本文通过参照 MABlockClosure
的实现和 Aspects
的 API 设计,基于 libffi 实现了对 Objective-C Block 的 hook。GitHub 地址:https://github.com/yulingtianxia/BlockHook
什么场景下需要 hook block 呢?在有源码的情况下,大部分程序员会选择直接在 block 中插代码。假如方法 A 的入参是个 block 对象,方法 A 将 block 传给方法 B,C…等。如果只有方法 A 的源码,上层传入的 block 和下层方法实现都是黑盒的话,想追踪 block 调用的时机,打印些 log,就得 hook 这个 block 对象了。
之前的 leader 送了我一块 Pebble 智能手表,俗话说『穷玩车,富玩表』,希望自己能在 2018 年里『变有钱』,那就多玩玩表吧!
我的 Objective-C 消息节流防抖库 MessageThrottle 需要实现一个特性:当 MTRule
的 target
释放后,自动调用 MTRule
的 discard
方法。后来使用了业界很早就已有的方案:Associated Object,在这里整理下相关的知识点。
在实际项目中经常会遇到因方法调用频繁而导致的 UI 闪动问题和性能问题,这时用某种策略需要控制调用频率,以达到节流和防抖的效果。MessageThrottle 是我实现的一个 Objective-C 消息节流和防抖的轻量级工具库,使用便捷且业务无关。
Threading Programming Guide 的学习笔记&翻译,第三部分。关于同步的内容。
Threading Programming Guide 的学习笔记&翻译,第二部分。关于 Run Loop 的内容。