正常情况下,通过分析界面以及 class-dump 出来头文件就能对某个功能的实现猜个八九不离十。我也一度被这个困难所阻挡,以为调用到有 Block 的方法就是进了死胡同,没办法继续跟踪下去了。在 LLVM 文档中,可以看到 可以看到第一个成员是 isa,说明了 Block 在 Objective-C 当中也是一个对象。但是,大多数情况下,我们并不需要进到 Block 函数体内。在写 tweak 的时候,我们更需要的是知道这个 Block 回调给了我们哪些参数。这个结构体在 Block 中是通过指针持有的,它的位置正好在 invoke 成员后面,占用 8 个字节。但是,文档指出并不是每个 Block 都是有方法签名的,我们需要通过 flags 与 block 中定义的枚举掩码进行与判断。虽然在文档中指出并不是每个 Block 都有函数签名的。最终,我们得到了这个 Block 的函数参数。

iOS通过逆向理解Block的内存模型

iOS通过逆向理解Block的内存模型

iOS通过逆向理解Block的内存模型