将Swift对象传递给JavaScript时崩溃

时间:2014-07-26 17:57:44

标签: objective-c swift javascriptcore

我尝试使用带有JavaScriptCore的Swift类。这就是我所拥有的:

import JavaScriptCore

@objc(MyObjExport) // explicit name required for class_copyProtocolList to work
public protocol MyObjExport: JSExport {
    var foo: String! { get }
}

@objc(MyObj)
public class MyObj: NSObject, MyObjExport
{
    public var foo: String! { return "bar" }
}

产生以下" MyModule-Swift.h"头:

SWIFT_PROTOCOL("MyObjExport")
@protocol MyObjExport <JSExport>
@property (nonatomic, readonly, copy) NSString * foo;
@end

SWIFT_CLASS("MyObj")
@interface MyObj : NSObject <MyObjExport>
@property (nonatomic, readonly, copy) NSString * foo;
@end

我可以从其他Obj-C代码中创建和使用这个对象,但是:

MyObj *foo = [[MyObj alloc] init];

[JSValue valueWithObject:foo inContext:nil]; // EXC_BAD_ACCESS

它在JSCore实现中崩溃了:

#0  0x00007fff87c5ca73 in objectToValueWithoutCopy(JSContext*, objc_object*) ()
#1  0x00007fff87c5c27e in objectToValue(JSContext*, objc_object*) ()
#2  0x00007fff87c5c20c in +[JSValue valueWithObject:inContext:] ()

(没有任何内容记录到控制台。)如果我在Obj-C而不是Swift中实现该类,它可以正常工作。什么错了,我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

当然你不希望你传递的JSContext创建JSValue为nil?

我尝试使用非nil上下文,我可以成功实例化JSValue,使用nil上下文与EXC_BAD_ACCESS崩溃。

这样可行:

JSContext *context = [[JSContext alloc] init];
MyObj *foo = [[MyObj alloc] init];
[JSValue valueWithObject:foo inContext:context];