【问题标题】:Create JSStringRef in Swift在 Swift 中创建 JSStringRef
【发布时间】: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() 给了我同样的错误)。我做错了什么?

【问题讨论】:

  • 为什么不使用JSStringRetainJSStringRelease
  • @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


【解决方案1】:

这是 JavaScriptCore 的 Swift 标头中的一个错误。正确的代码现在是,例如:

import JavaScriptCore

let str = JSStringCreateWithCFString("an example")
let len = JSStringGetLength(str)
JSStringRelease(str)

【讨论】:

    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多