【问题标题】:Variable argument list to JavascriptCore blockJavascriptCore 块的变量参数列表
【发布时间】:2014-02-11 03:49:19
【问题描述】:

我想在 JavascriptCore 上下文中定义一个函数,它接受可变数量的参数。

类似这样的:

JSVirtualMachine* virtualMachine = [[JSVirtualMachine alloc] init];
JSContext* ctx = [[JSContext alloc] initWithVirtualMachine:virtualMachine];

ctx[@"func"] = ^(JSValue* value, ...){
    va_list args;
    va_start(args, value);
    for (JSValue *arg = value; arg != nil; arg = va_arg(args, JSValue*)) {
        NSLog( @"%@", arg);
    }
    va_end(args);
};

[ctx evaluateScript:@"func('arg1', 'arg2');"];

我相信 JSC 包装器不会将第二个参数传递给块,因为在记录第一个参数后迭代 va_list 会崩溃。

我也尝试了NSArray* 约定,它不起作用。

这有可能吗?

【问题讨论】:

  • 我在定义一个需要多个参数的 Objective-C 控制台日志处理程序时也尝试过这样做,但即使使用 NSLogv 也无法实现。一种混乱的方法 - 您可以尝试通过 JSON 将 args 序列化为单个 arg,然后将其解压缩到您的 Objective-C 处理程序中。
  • 是的,这将是最后的手段。实际上有一种方法可以使用常规的 C API,使用 JSObjectMakeFunctionWithCallback,但我想离开那个 C 接口,以便 ARC 可以处理 JS Value 的内存。

标签: iphone ios7 objective-c-blocks javascriptcore


【解决方案1】:

来自 JSContext.h:

// This method may be called from within an Objective-C block or method invoked
// as a callback from JavaScript to retrieve the callback's arguments, objects
// in the returned array are instances of JSValue. Outside of a callback from
// JavaScript this method will return nil.
+ (NSArray *)currentArguments;

导致以下情况:

ctx[@"func"] = ^{
    NSArray *args = [JSContext currentArguments];
    for (JSValue *arg in args) {
        NSLog( @"%@", arg);
    }
};

[ctx evaluateScript:@"func('arg1', 'arg2');"];

【讨论】:

  • 这也是从参数中获取 JSValue 对象的好方法。刚刚发现将 JSValues 作为块参数(如ctx[@"func"] = ^(JSValue* value){...})会泄漏传递的值。听起来好像块保留值所以,上下文保留块,块保留值,值保留上下文。
【解决方案2】:

我喜欢@erm410 的回答,我没有看过有关 currentArguments 的文档。

我采用的另一种方法是将 JSON 对象传递给 Objective-C NSDictonary。这种方法的一个好处是您已经命名了参数 - 尽管您正在处理需要在调用和处理程序之间正确键入的字符串文字。

ctx[@"func"] = ^(NSDictionary *args) {
    NSLog(@"%@", args[@"arg1"];
};

[ctx evaluateScript:@"func({'arg1':'first','arg2':'second'})"];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2012-10-01
    • 2012-08-29
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多