簡體   English   中英

使用Typhoon在運行時注入閉包時的EXC_BAD_ACCESS

[英]EXC_BAD_ACCESS when injecting a closure at runtime using Typhoon

我有一個混合的ObjC和Swift iOS項目。

我有一個類用於測試在運行時注入一個簡單的閉包:

@objc
class TyphoonClosureTester: NSObject {
    @objc var closure: (() -> Void)?

    @objc
    override init() {}

    @objc
    init(closure: (() -> Void)?) {
        self.closure = closure
    }

    @objc
    func callClosure() {
        guard let closure = closure else {
            assert(false, "no closure 1")
            return
        }
        closure()
        NSLog("Have called closure 1 OK")
    }
}

我的Typhoon程序集文件包含這個函數:

func testAClosure(closure: @escaping () -> Void) -> AnyObject {
    return TyphoonDefinition.withClass(TyphoonClosureTester.self) { definition in
        definition?.useInitializer(#selector(TyphoonClosureTester.init(closure:))) { initializer in
            initializer?.injectParameter(with: closure)
        }

        definition?.scope = .prototype
    } as AnyObject
}

我嘗試使用此閉包如下:

let closureTester1: TyphoonClosureTester = assembler.testAClosure(closure: {
    NSLog(" closure 1 called!")
}) as! TyphoonClosureTester

// causes EXC_BAD_ACCESS
closureTester1.callClosure()

但是當我調用閉包時,這會導致EXC_BAD_ACCESS (確切的消息是Thread 1: EXC_BAD_ACCESS (code=1, address=0x0) )所以它看起來像是在某處解除分配。

我已經嘗試將捕獲添加到程序集中(即[closure] )但它沒有區別:

func testAClosure(closure: @escaping () -> Void) -> AnyObject {
    return TyphoonDefinition.withClass(TyphoonClosureTester.self) { [closure] definition in
        definition?.useInitializer(#selector(TyphoonClosureTester.init(closure:))) { [closure] initializer in
            initializer?.injectParameter(with: closure)
        }

        definition?.scope = .prototype
    } as AnyObject
}

我也嘗試將閉包作為屬性注入,而不是通過init,它沒有任何區別。

從內存中不支持。 您可以嘗試查看測試用例中的示例。

這里描述了注入包裹的基元: https//github.com/appsquickly/typhoon/wiki/wrap-primitive-values-into-NSValue

但是沒有提到塊/閉包。

如果您描述了您希望實現的目標,可以建議采用下一個最佳解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM