NSObject在传递给JavaScriptCore后没有被释放

时间:2016-09-30 13:24:08

标签: ios swift javascriptcore

我正在创建JSContext并评估一小段javascript ...

function test(obj) {
}

接下来,我创建的NSObject只包含INITDEINIT功能。

当我调用javascript测试函数并传入NSObject时,NSObjects DEINIT方法永远不会被调用。我不确定为什么在Test函数执行后没有任何东西可以保持它不被释放。

Swift Playground

import UIKit
import JavaScriptCore

/**************************/
/******* SwiftObject ******/
/**************************/
@objc protocol SwiftObjectExport: JSExport {
}

class SwiftObject: NSObject, SwiftObjectExport {
    override init() {
        super.init()
        print("[INIT] SwiftObject")
    }

    deinit {
        print("[DEINIT] SwiftObject")
    }
}

/**************************/
/******** Main ************/
/**************************/

// DEINIT does NOT fires with this test
func test() {
    let jsContext = JSContext()
    jsContext?.evaluateScript("function test(obj) { } ")

    let obj = SwiftObject()
    jsContext?.objectForKeyedSubscript("test").call(withArguments: [obj])
}

// DEINIT fires with this test
func test2() {
    let jsContext = JSContext()
    jsContext?.evaluateScript("function test(obj) { } ")

    let obj = SwiftObject()
}


print("Running test 1...")
test() // DEINIT does NOT fires with this test

print("Running test 2...")
test2() // DEINIT fires with this test

1 个答案:

答案 0 :(得分:1)

在实际应用程序中,所有代码都包含在自动释放池中。在游乐场,事实并非如此。

只需在测试代码周围添加一个自动释放池,这样就可以解决您的问题:

autoreleasepool {
    print("Running test 1...")
    test()

    print("Running test 2...")
    test2()

    print("Inside autorelease pool")
}

print("Outside autorelease pool")

输出:

Running test 1...
[INIT] SwiftObject
Running test 2...
[INIT] SwiftObject
[DEINIT] SwiftObject
Inside autorelease pool
[DEINIT] SwiftObject
Outside autorelease pool