BlockHook 快速上手:10 分钟 Hook 第一个 Objective-C Block 的完整教程

📅 2026/8/18 16:19:48
BlockHook 快速上手:10 分钟 Hook 第一个 Objective-C Block 的完整教程
BlockHook 快速上手10 分钟 Hook 第一个 Objective-C Block 的完整教程【免费下载链接】BlockHookHook Objective-C blocks. A powerful AOP tool.项目地址: https://gitcode.com/gh_mirrors/bl/BlockHook在 iOS / macOS 开发中AOP面向切面编程是解耦业务逻辑的利器而BlockHook就是一款专门用于Hook Objective-C Block的轻量级 AOP 工具。它基于 libffi 实现支持在 Block 执行前、执行中、执行后甚至销毁时插入自定义代码还能修改参数与返回值。本教程将带你用 10 分钟跑通第一个 Hook 案例并掌握从集成到实战的完整流程。BlockHook 能做什么四大 Hook 模式一览BlockHook 的核心能力是把一段 Block 的完整生命周期都暴露给你模式触发时机典型用途BeforeBlock 执行前埋点统计、日志记录、参数校验Instead替换原实现改变返回值、修改参数、路由拦截AfterBlock 执行后读取结果、后置处理、性能分析DeadBlock 销毁时内存监控、资源回收、生命周期追踪它支持在同一个 Block 上叠加多个 Hook也可以随时撤销配合 BHToken 令牌还能实现精细化管理。第一步安装 BlockHook 的最快配置方法BlockHook 支持三种集成方式这里推荐 CocoaPods 一键安装在 Podfile 中写入pod BlockHook执行pod install在工程中#import BlockHook/BlockHook.h即可。工程需导入 libffiBlockHook 已在 iOS 8.0、macOS 10.10、tvOS 9.0 上完成适配仓库内自带 libffi.xcframework 预编译产物无需额外配置。核心源码只有 BlockHook.h、BHToken.h、BHInvocation.h 几个文件阅读起来非常轻量。第二步Hook 第一个 Objective-C Block 的完整代码下面是一个一次 Hook 全部四种模式的经典示例把 Block 的返回值从 8 悄悄改成 15然后在 Block 销毁时收到回调。NSObject *z NSObject.new; int(^block)(int x, int y) ^int(int x, int y) { int result x y; NSLog(%d %d %d, x, y, result); return result; }; BHToken *token [block block_hookWithMode: BlockHookModeDead|BlockHookModeBefore|BlockHookModeInstead|BlockHookModeAfter usingBlock:^(BHInvocation *invocation, int x, int y) { int ret 0; [invocation getReturnValue:ret]; switch (invocation.mode) { case BlockHookModeBefore: NSLog(hook before block!); break; case BlockHookModeInstead: [invocation invokeOriginalBlock]; ret x * y; // 加号变乘号 [invocation setReturnValue:ret]; // 改返回值 8 - 15 break; case BlockHookModeAfter: NSLog(hook after block! %d * %d %d, x, y, ret); break; case BlockHookModeDead: NSLog(block dead! token:%, invocation.token); break; } }]; int ret block(3, 5); // 输出 hooked result:15 [token remove]; // 随时撤销 Hook ret block(3, 5); // 输出 original result:8运行后你会发现被 Hook 成了*返回值从 8 变成了 15移除 token 后一切又恢复原样。完整运行日志和更多用例可以参考 BlockHookSampleTests.m 中的测试代码。第三步理解 BHInvocation 与 BHToken 的实战用法BHToken每次 Hook 都会返回一个令牌通过remove方法撤销 Hook通过mangleName查看 Block 的符号名还自带userInfo字典用于携带业务数据BHInvocation相当于 Block 的现场快照可以调用invokeOriginalBlock执行原始实现用getReturnValue/setReturnValue读写返回值用getArgument:atIndex:/setArgument:atIndex:修改参数——连 CGRect 这类结构体参数都能完美处理。进阶技巧用 Block Interceptor 实现异步拦截当你想在 Block 真正执行前做异步操作比如先登录、再放行时可以用block_interceptor:实现拦截器只需在回调里调用completion()放行即使延迟 0.5 秒异步执行也没问题。这个特性非常适合做路由守卫、权限校验等场景。小结你的第一行 AOP 代码已经跑通BlockHook 用极简的 API 让Objective-C Block Hook变得触手可及无需改写业务代码、无需引入复杂的运行时黑魔法就能在 Block 的前、中、后、亡四个阶段自由编排逻辑。想快速体验也可以直接运行仓库中的BlockHookSample iOS、BlockHookSample tvOS或BlockHookSample macOS示例工程对照 MRCTests.m 还能看到它在 MRC 环境下的内存安全实践。现在就动手让 10 分钟的教程变成你日常开发的得力工具吧【免费下载链接】BlockHookHook Objective-C blocks. A powerful AOP tool.项目地址: https://gitcode.com/gh_mirrors/bl/BlockHook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考