【问题标题】:NSObject not being released after passing to JavaScriptCoreNSObject 在传递给 JavaScriptCore 后没有被释放
【发布时间】:2016-09-30 13:24:08
【问题描述】:

我正在创建一个 JSContext 并评估一个简单的 javascript...

function test(obj) {
}

接下来,我将创建一个 NSObject,其中仅包含 INITDEINIT 函数。

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

斯威夫特游乐场

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

【问题讨论】:

    标签: ios swift javascriptcore


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2020-01-29
      • 2022-01-13
      • 1970-01-01
      • 2021-11-20
      • 2011-06-01
      • 2019-08-09
      相关资源
      最近更新 更多