【问题标题】:Crash when passing Swift objects to JavaScript将 Swift 对象传递给 JavaScript 时崩溃
【发布时间】:2014-07-26 17:57:44
【问题描述】:

我正在尝试使用带有 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 中实现该类,它可以正常工作。出了什么问题,我该如何解决?

【问题讨论】:

    标签: objective-c swift javascriptcore


    【解决方案1】:

    您肯定不希望您传递的创建 JSValue 的 JSContext 为 nil 吗?

    我尝试使用非 nil 上下文,我可以成功实例化一个 JSValue,使用 nil 上下文它会因 EXC_BAD_ACCESS 而崩溃。

    这可行:

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

    【讨论】:

      猜你喜欢
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2017-07-21
      • 2012-07-30
      相关资源
      最近更新 更多