2016-09-30 2 views
1

나는 JSContext 만들고 javascript의 간단한 조각을 평가하고 있습니다에 통과 이후에 출시되지NSObject의이 ... JavaScriptCore는

function test(obj) { 
} 

다음, 내가 만드는거야 INIT 다음 아무 이상 포함하지 않는 NSObjectDEINIT 기능.

자바 스크립트 테스트 함수를 호출하고 NSObject을 전달하면 NSObjectsDEINIT 메서드가 호출되지 않습니다. 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 

답변

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