2014-07-26 1 views
2

JavaScriptCore과 함께 Swift 클래스를 사용하려고합니다. 이것은 내가 무엇을 가지고 :Swift 객체를 JavaScript로 전달할 때 크래시가 발생합니다.

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 코드에서 잘이 객체를 사용할 수 있지만 :

다음 " MyModule-Swift.h"헤더를 생성

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" } 
} 

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:]() 

(아무 것도 콘솔에 기록되지 않습니다.) Swift 대신 Obj-C 클래스를 구현하면 정상적으로 작동합니다. 무엇이 잘못되었으며 어떻게 해결할 수 있습니까?

답변

2

JSValue를 전달하는 JSContext를 nil로 지정하고 싶지 않습니까?

전 (non-nil) 컨텍스트에서 시도했는데 EXC_BAD_ACCESS와 충돌하는 nil 컨텍스트와 함께 JSValue를 성공적으로 인스턴스화 할 수 있습니다.

이 작동합니다 :

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