typhoon - 使用 Typhoon 在运行时注入(inject)闭包时的 EXC_BAD_ACCESS

标签 typhoon

我有一个混合的 ObjC 和 Swift iOS 项目。

我有一个类用于在运行时测试一个普通闭包的注入(inject):

@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
}

我还尝试将闭包作为属性注入(inject),而不是通过 init,它没有任何区别。

最佳答案

从内存来看,这是不支持的。您可以尝试在测试用例中查找示例。

此处描述了注入(inject)包装的原语:https://github.com/appsquickly/typhoon/wiki/wrap-primitive-values-into-NSValue

. .但是没有提到 block /闭包。

如果您描述了您想要实现的目标,则可以建议下一个最佳解决方法。

关于typhoon - 使用 Typhoon 在运行时注入(inject)闭包时的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934926/

相关文章:

ios - 如何使用 Typhoon 为集成测试注入(inject)假的、 stub 的或模拟的依赖项

ios - 用 Typhoon 注入(inject)模拟

ios - 台风:组装和 Storyboard创建的 ViewControllers

ios - 台风注入(inject)属性

objective-c - 台风:如何让一个实例符合生产协议(protocol),另一个实例用于测试?

ios - 具有 View Controller 属性的台风

ios - 台风框架 : Swift or Objective-C

ios - 台风不会注入(inject)普通的 NSObject 派生类

swift - 使用 Typhoon 两次注入(inject)相同的属性

iOS Typhoon DI 框架替代 objective-c 中的单例