十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

JSDebugger 方法调用语法全解:冒号转下划线的规则与 10 个实用示例

JSDebugger 方法调用语法全解:冒号转下划线的规则与 10 个实用示例 JSDebugger 方法调用语法全解冒号转下划线的规则与 10 个实用示例【免费下载链接】JSDebuggerJavaScript-Based Debugger For Inspecting Running State Of Your Application项目地址: https://gitcode.com/gh_mirrors/js/JSDebugger想用 JavaScript 直接驱动 Objective-C 代码、在运行时随心所欲地调用任意 OC 方法吗JSDebugger 方法调用语法正是为此而生。这个开源 iOS 调试工具的最大亮点是无需手动声明任何 JSExport就能在 JS 环境里调用几乎所有的 Objective-C 方法。而这一切的起点就是一条简单却极其关键的规则冒号转下划线。本文将以新手也能看懂的方式带你彻底搞懂这条规则并附上 10 个可直接照抄的实用示例。一、JSDebugger 是什么JSDebugger 是一个基于 JavaScript 的运行时状态检查工具核心能力是让开发者用 JS 脚本实时查看和修改 App 的运行状态。你可以在不重新编译、不打断运行的情况下动态调用 Objective-C 方法、读写属性、操作结构体和指针甚至直接查找堆上的任意对象。它的使用方式非常简单在工程中引入JDEngine启动引擎后加载一个.js脚本剩下的就是写 JS 调用 OC 的世界了。二、核心规则冒号转下划线怎么转Objective-C 的方法selector由多个片段用冒号连接例如application:didFinishLaunchingWithOptions:而 JavaScript 中不允许出现冒号作为方法名的一部分于是 JSDebugger 做了两步转换把所有冒号:替换成下划线_把 selector 的各个片段拼接成一个字符串上面的方法就会变成application_didFinishLaunchingWithOptions_调用时把参数按顺序填进括号即可application_didFinishLaunchingWithOptions_(application, launchOptions)也就是说OC 里有多少个冒号JS 里就有多少个下划线参数顺序一一对应。反过来当你在 JS 里写下划线方法名时引擎内部会按下划线拆分再补回冒号去匹配真实的 OC selector——这一步在Source/Core/Util/JDFormatJSFunction.m中完成。三、10 个实用示例从入门到进阶1. 无参数方法最简单的调用var view UIView.alloc().init();alloc和init都是无冒号方法直接原样调用即可。2. 单参数方法第一个下划线出现ViewController.printNSArray_(array);OC 中的 (void)printNSArray:(NSArray *)array只有一个参数对应一个冒号转成 JS 就是末尾一个下划线。3. 多参数方法冒号数量要对齐ViewController.testStr_value_(hello, 1.0, 2.0);每个冒号对应一个下划线参数顺序和 OC 声明完全一致。数错下划线是新手最常见的报错原因。4. 链式调用返回值继续调用vc.view().setBackgroundColor_(UIColor.redColor());先取view再直接调用其 setter一气呵成和 OC 点语法一样顺滑。5. 变长参数支持 NIL 结尾var array NSArray.arrayWithObjects_(72, 2, 3); ViewController.test_(1, 2, 4, 7);JSDebugger 支持变长参数variadic arguments以 NIL 作为终止标记传入任意数量的参数都没问题。6. Getter 与 Setter一个加括号一个用等号label.text WZQTQL; // setter直接赋值 var text label.text(); // getter必须用方法调用加括号⚠️ 重点Getter 不支持属性方式读取。label.text是错的必须写成label.text()。7. 结构体 Struct当作普通 JS 对象操作var frame vc.view().frame(); frame.origin.x 100; vc.view().frame frame;结构体在 JS 中被当作普通对象字段可以直接读写甚至可以直接传对象字面量label.frame {origin:{x:0, y:10}, size:{width:200, height:100}};8. C 指针直接传递和读取var intP vc.allocAddressWithInt(); vc.testIntPointer_(intP);JSDebugger 支持 C 指针的传递返回值可以继续作为参数使用。9. 关联对象 Associate Objectvar aso TestAssociateObject.alloc().init(); vc.associateObject aso; var val aso.associateInt;关联对象的读写走的是普通属性语法访问时引擎会自动查询objc_getAssociatedObject。10. choose 插件查找堆上任意对象var label choose(UILabel)[0]; label.text WZQTQL;choose会精确匹配类名返回堆上所有该类的实例数组堪称调试利器。四、常见误区与避坑指南误区正确写法view.backgroundColorview.backgroundColor()漏写末尾下划线每个冒号都要转下划线下划线数量与参数不符冒号数 下划线数 参数段数自定义变长方法末尾加 NIL以 NIL 结束如test_(1, 2, 3)五、原理补充转换发生在哪里冒号转下划线只是语法层真正的方法桥接由引擎底层完成。感兴趣的话可以查阅这些源码文件Source/Core/Util/JDFormatJSFunction.mJS 方法名下划线 → OC selector 冒号的还原逻辑Source/Core/Runtime/JSDefinition/JDMethod4JS.mJS 函数调用 → OC 方法调用的桥接Source/Core/FFI/JDFFIContext.m基于 libffi 的参数与返回值转发JSDebuggerDemo/demo.js完整可运行的示例脚本示例 110 全部收录其中JSDebuggerDemo/JSDebuggerDemo/ViewController.m示例中 OC 端方法的实现可对照学习六、总结JSDebugger 方法调用语法只有一条核心规则——冒号转下划线但围绕它衍生出的链式调用、变长参数、结构体、指针、关联对象等能力足以覆盖日常调试的绝大多数场景。记住三个要点下划线数量对应冒号数量、getter 必须加括号、变长参数以 NIL 结尾你就能像写 OC 一样流畅地在 JS 里操控整个 App 的运行状态了。快打开 demo.js 亲手试试吧调试的世界会豁然开朗【免费下载链接】JSDebuggerJavaScript-Based Debugger For Inspecting Running State Of Your Application项目地址: https://gitcode.com/gh_mirrors/js/JSDebugger创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表