我正在创建JSContext
并评估一小段javascript
...
function test(obj) {
}
接下来,我创建的NSObject
只包含INIT
和DEINIT
功能。
当我调用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
答案 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