JRSwizzle进阶技巧:jr_swizzleClassMethod安全交换类方法,原理与完整示例全解
JRSwizzle进阶技巧jr_swizzleClassMethod安全交换类方法原理与完整示例全解【免费下载链接】jrswizzleone-stop-shop for all your method swizzling needs项目地址: https://gitcode.com/gh_mirrors/jr/jrswizzleJRSwizzle是 Objective-C 开发者的方法交换Method Swizzling一站式工具包其核心能力jr_swizzleClassMethod可以安全、正确地交换两个类方法的实现——哪怕方法是从父类继承来的也不会出现改错对象的隐蔽 bug。本文讲透它的元类metaclass工作原理并给出可直接上手的完整示例与避坑指南。先认识 JRSwizzle为什么需要方法交换工具在 iOS / macOS 开发中我们经常需要在不修改第三方源码的前提下增强某个类的行为给NSString加一个扩展方法埋点、拦截某个 SDK 的初始化流程、替换 UIKit 某个视图的绘制逻辑……这些场景的共同解法就是方法交换。但手写方法交换代码坑很多社区至少流传着四种实现实现方案交换继承方法是否正确兼容性Classic经典版❌ 会误伤父类10.4Ballard 版✅10.4Apple 官方method_exchangeImplementations❌ 继承场景仍出错10.5JRSwizzle✅ 全部正确10.3 / iOS 2.0JRSwizzle 的价值就在于用一个简单、正确、跨版本一致的接口覆盖你所有的方法交换需求one-stop-shop for all your method swizzling needs。详细对比可参考 README.markdown 中的 Comparison 章节。项目入口文件 JRSwizzle.h 只声明了 4 个 API非常轻量 (BOOL)jr_swizzleMethod:(SEL)origSel_ withMethod:(SEL)altSel_ error:(NSError**)error_; (BOOL)jr_swizzleClassMethod:(SEL)origSel_ withClassMethod:(SEL)altSel_ error:(NSError**)error_;进阶核心jr_swizzleClassMethod 为什么更安全原理一句话类方法 元类上的实例方法这是理解jr_swizzleClassMethod的关键每个 Objective-C 类都有一个隐藏的元类metaclass类方法foo本质上是元类上的一个实例方法。所以交换类方法的正确姿势其实是到元类上去做实例方法交换。看 JRSwizzle.m 中该 API 的实现只有短短一行核心逻辑 (BOOL)jr_swizzleClassMethod:(SEL)origSel_ withClassMethod:(SEL)altSel_ error:(NSError**)error_ { return [GetClass((id)self) jr_swizzleMethod:origSel_ withMethod:altSel_ error:error_]; }GetClass((id)self)取出的是元类即object_getClass然后复用实例方法交换的完整逻辑。这带来三个安全红利✅自动限定作用范围只影响本类的类方法不会波及其他继承者✅正确处理继承若原方法是继承来的会先提升hoist到目标类再交换避免经典版那种误伤父类的 bug✅全参数校验 高质量错误诊断找不到方法时通过NSError返回可读信息而不是静默失败。而实例方法版本jr_swizzleMethod在较新运行时的核心就是class_addMethodmethod_exchangeImplementations两步组合见 JRSwizzle.m对继承场景天然正确。完整示例三步交换一个类方法下面是一个可运行的完整流程演示如何用jr_swizzleClassMethod增强UIView的类方法第 1 步在分类里定义替代实现// JRSwizzleExample.m interface UIView (Swizzle) (void)jr_loggedViewDidLoad; // 替代实现 end implementation UIView (Swizzle) (void)jr_loggedViewDidLoad { // 先调用原来的类方法实现已互换 [self jr_loggedViewDidLoad]; NSLog(UIView 类方法被调用可在此做统一埋点/日志); } end第 2 步在initialize中执行交换只需执行一次 (void)initialize { static dispatch_once_t onceToken; dispatch_once(onceToken, ^{ NSError *error nil; BOOL ok [UIView jr_swizzleClassMethod:selector(loaded) withClassMethod:selector(jr_loggedViewDidLoad) error:error]; if (!ok) { NSLog(交换失败%, error.localizedDescription); } }); }第 3 步正常调用行为已悄悄被增强此后任何地方调用[UIView loaded]都会自动经过jr_loggedViewDidLoad的增强逻辑调用方完全无感知。⚠️ 两个高频坑位必须在initialize或dispatch_once中交换避免多次交换导致实现换回原样替代方法里要主动调用原方法如上例第一行因为交换后两处实现互换否则会陷入无限递归。进阶技巧Block 版 API 让交换更优雅如果你不想写一个完整的替代方法v1.1.0 新增了Block 版 API见 JRSwizzle.h__block NSInvocation *classInvocation nil; classInvocation [UIView jr_swizzleClassMethod:selector(loaded) withBlock:^id { NSLog(before); [classInvocation invoke]; // 调用原实现 NSLog(after); return nil; } error:nil];原理上它用imp_implementationWithBlock把 Block 临时挂载为类的一个方法再走一次方法交换见 JRSwizzle.m。适合快速插桩、调试日志若追求性能官方也提示NSInvocation并非最快的调用方式生产环境建议用经典的 SEL 版本。安装与快速接入方式一CocoaPodspod JRSwizzle, 1.1.0Pod 规格见 JRSwizzle.podspec支持 iOS 4.3 与 macOS 10.6基于 MIT 协议。方式二Git 子模块$ git submodule add https://gitcode.com/gh_mirrors/jr/jrswizzle JRSwizzle semver-1.x $ git submodule init git submodule update然后把 JRSwizzle.h 和 JRSwizzle.m 两个文件加入工程即可。官方测试继承场景才是试金石仓库自带完整测试工程 JRSwizzleTest其中 JRSwizzleTest.m 专门验证了最刁钻的继承方法交换场景子类B8未重写foo8继承自父类A8交换后[a foo8]→ 仍走父类原实现 ✅[b foo8]→ 走子类替代实现 ✅这正是 Classic 方案会翻车、而 JRSwizzle 全程正确的场景对照 ClassicSwizzleTest.m 中KNOWN INCORRECT BEHAVIOR注释。总结jr_swizzleClassMethod的本质是在元类上做实例方法交换天然安全、作用域精准 使用三板斧dispatch_once防重、替代方法里调原实现、始终传入NSError检查失败 插桩调试用 Block 版性能敏感场景用 SEL 版 继承场景的边界行为有官方测试背书可以放心用于生产。掌握了jr_swizzleClassMethod你已经可以安全地对任何类方法做无侵入式增强——这正是 JRSwizzle 作为方法交换一站式商店的核心承诺。【免费下载链接】jrswizzleone-stop-shop for all your method swizzling needs项目地址: https://gitcode.com/gh_mirrors/jr/jrswizzle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MeterSphere ai-engine 多模型 AI 聊天引擎深度解析:架构设计、配置实战与提示词工程

MeterSphere ai-engine 多模型 AI 聊天引擎深度解析:架构设计、配置实战与提示词工程

质量保障接口测试测试后端前端AI 应用DevOps 【免费下载链接】metersphere MeterSphere 是新一代的开源持续测试工具,内置 AI 助手,让软件测试工作更简单、更高效,不再成为持续交付的瓶颈。 项目地址: https://gitcode.com/gh_mir…

2026/10/3 19:55:38 阅读更多 →
杭州市能源集团社招笔试|双监控必看指南

杭州市能源集团社招笔试|双监控必看指南

收到杭州能源集团笔试通知的宝子速码📝,细节超多千万别踩雷! ⏰考试时间重点 正式笔试:9月29日19:00‑20:00,考试时长60分钟! ❗不允许迟到,迟到直接无法进入系统!提前30分钟登录&am…

2026/10/3 19:55:38 阅读更多 →
rig-vertexai 集成指南:在 Rig 中使用 Google Cloud Vertex AI(Gemini)构建 Rust LLM 应用

rig-vertexai 集成指南:在 Rig 中使用 Google Cloud Vertex AI(Gemini)构建 Rust LLM 应用

AI AgentAgent 框架RAG后端 【免费下载链接】rig ⚙️🦀 Build modular and scalable LLM Applications in Rust 项目地址: https://gitcode.com/GitHub_Trending/rig2/rig 点击查看 免费下载 导读 本文基于仓库中 crates/rig-vertexai/CHANGELOG.md 的…

2026/10/3 19:55:38 阅读更多 →

最新新闻

SpringBoot+Vue停车场管理系统毕设全解析:从架构设计到部署实战

SpringBoot+Vue停车场管理系统毕设全解析:从架构设计到部署实战

做毕设选“SpringBootVue停车场管理系统”这个题目的人,这两年是真的多。原因也很实在:技术栈主流、业务场景清晰、前后端分离的架构踩中当下企业开发的主流范式,答辩时既能讲业务又能讲技术,怎么都有话说。不过题目选得容易&…

2026/10/3 20:52:55 阅读更多 →
SSM+Vue教工公寓管理系统毕业设计:从项目搭建到论文答辩全指南

SSM+Vue教工公寓管理系统毕业设计:从项目搭建到论文答辩全指南

每年到这个时间点,就会有一批计算机专业的大四学生开始为毕业设计头疼。2026届的学弟学妹们,如果你正在纠结选题,或者已经选了“基于SSM的教工公寓管理系统”这类题目却不知道从何下手,这篇内容就是写给你看的。这套题目可以说是经…

2026/10/3 20:51:54 阅读更多 →
基于ZooKeeper的在线状态漂移检测与选主实现

基于ZooKeeper的在线状态漂移检测与选主实现

1. 先聊清楚:微信个人号多设备场景下的“在线状态漂移”是什么 1.1 多个实例同时工作,为什么会产生状态分歧 如果你搭过微信个人号相关的中台服务,一定遇过这种奇怪现象:后台明明显示账号在线,消息流水也正常&#xf…

2026/10/3 20:51:54 阅读更多 →
专科生AI辅助开题报告:9个实用工具、完整流程与学术诚信红线

专科生AI辅助开题报告:9个实用工具、完整流程与学术诚信红线

先说一个前提:这篇文章只聊合法合规的AI写作辅助,用来帮你把开题报告、文献综述这种东西从“憋不出来”变成“改得出来”。最终交上去的文档必须是你自己一个字一个字改过、认过、能讲清楚的,否则别往下看。 2026届专科生现在应该刚好要开题…

2026/10/3 20:51:52 阅读更多 →
路标检测数据集:1000张实拍图+YOLO/VOC/COCO三格式标签

路标检测数据集:1000张实拍图+YOLO/VOC/COCO三格式标签

简介:本资源是面向计算机视觉初学者与YOLO目标检测实践者的路标识别专项数据集及配套训练工具包,解决真实场景下交通标志检测模型训练缺乏高质量标注数据与完整流程支持的问题。压缩包共2000个文件,含1000张实拍路标图像、990个YOLO格式标签&…

2026/10/3 20:49:51 阅读更多 →
离线Spark与实时Flink双链路数仓架构选型与避坑指南

离线Spark与实时Flink双链路数仓架构选型与避坑指南

简介:一套涵盖 Spark 离线数仓与 Flink 实时数仓的完整工程实现资料,面向大数据开发者和数仓方向学习者,适合具备常用组件基础、希望系统掌握数仓分层设计与项目落地的中高级读者。实时数仓按 ODS→DWD→DWS 分层设计:ODS/DWD 层采…

2026/10/3 20:49:51 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →