JSDebugger 方法调用语法全解:冒号转下划线的规则与 10 个实用示例
2026/8/30 5:25:46 网站建设 项目流程

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 做了两步转换:

  1. 把所有冒号(:)替换成下划线(_)
  2. 把 selector 的各个片段拼接成一个字符串

上面的方法就会变成:

application_didFinishLaunchingWithOptions_

调用时把参数按顺序填进括号即可:

application_didFinishLaunchingWithOptions_(application, launchOptions)

也就是说:OC 里有多少个冒号,JS 里就有多少个下划线,参数顺序一一对应

反过来,当你在 JS 里写下划线方法名时,引擎内部会按下划线拆分,再补回冒号去匹配真实的 OC selector——这一步在Source/Core/Util/JDFormatJSFunction.m中完成。


三、10 个实用示例:从入门到进阶

1. 无参数方法:最简单的调用

var view = UIView.alloc().init();

allocinit都是无冒号方法,直接原样调用即可。

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 Object

var 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.m:JS 方法名下划线 → OC selector 冒号的还原逻辑
  • Source/Core/Runtime/JSDefinition/JDMethod4JS.m:JS 函数调用 → OC 方法调用的桥接
  • Source/Core/FFI/JDFFIContext.m:基于 libffi 的参数与返回值转发
  • JSDebuggerDemo/demo.js:完整可运行的示例脚本,示例 1~10 全部收录其中
  • 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询