2014-07-26 53 views
2

我試圖在JavaScriptCore上使用Swift類。這是我有:將Swift對象傳遞給JavaScript時發生崩潰

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中實現類,它工作正常。什麼是錯,我該如何解決這個問題?

回答

2

當然,你不希望你傳遞的JSContext創建JSValue爲零?

我嘗試了一個非零上下文,我可以成功實例化一個JSValue,使用EXC_BAD_ACCESS使其無效的上下文崩潰。

這會工作:

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