【发布时间】:2015-03-22 04:07:02
【问题描述】:
我在 Swift 中使用新的(即 Objective-C)JavaScriptCore API。但是,JSContext 的 evaluateScript 方法不支持 JSEvaluateScript(来自 C API)支持的源 URL 和起始行号参数,所以我试图从我的 Swift 代码中调用 C 方法。
C 方法采用 JSStringRefs 而不是字符串,所以我需要创建它们。当我尝试明显的解决方案时:
println(JSStringCreateWithCFString("an example").takeRetainedValue())
我得到一个 EXC_BAD_ACCESS(代码=EXC_I386_GPFLT)。 (我使用takeRetainedValue(),因为文档指出JSStringCreateWithCFString 遵循Create Rule,但takeUnretainedValue() 给了我同样的错误)。我做错了什么?
【问题讨论】:
-
为什么不使用
JSStringRetain和JSStringRelease? -
@findall AFAIK 这些不适用于 Swift 代码。如果您 cmd+单击 JSStringCreateWithCharacters 之类的符号,则它们不在生成的符号列表中它们应该在的位置。
-
我发现 Xcode 6.3 beta 和 6.2 的情况有所不同。在 6.3 beta 中,retain/release 函数在列表中可见,不幸的是,即使
JSStringCreateWithCFString的返回类型与 6.2 不同。 -
嗯……6.3 beta 的返回类型是什么?
-
嗯,我刚刚尝试了 Xcode 6.3 beta 中的简单示例
let scriptJS = JSStringCreateWithCFString("window.foo = 'test'"); JSEvaluateScript(context.JSGlobalContextRef, scriptJS, nil, nil, 0, nil); JSStringRelease(scriptJS),它运行良好。那么,你认为这只是一个错误吗?
标签: swift javascriptcore