没有内存泄漏的惰性 CocoaAction #2 方法

lazy CocoaAction without memory leak #2 way

RxSwift 是一个强大的功能,但有时我会搬起石头砸自己的腿。 问题在于 Resource count 和对象释放。 我想在视图模型中将 lazy var 用于 CocoaAction。它在此流程中运行良好:

lazy var onCancel: CocoaAction = { [unowned self] _ in
    return CocoaAction {
        return self.coordinator.pop()
    }
}()

ControllerView Model 从内存中删除 - 太棒了!

当我尝试使用外部 self 值时出现问题(对象没有删除,因为动作捕获强 referenceself)。如何避免在这里循环?

lazy var onCancel: CocoaAction = { this in
    return CocoaAction {
        return this.coordinator.pop()
    }
} (self)

在这两种情况下,您都需要传递对 CocoaAction 的弱引用以避免循环保留。您的第一个案例之所以有效,是因为您将 unowned self 传递给第一个闭包,该闭包最终传递给第二个闭包而不增加保留计数。在第二种情况下,您将 self 作为名为 this 的参数传递给闭包,并且 this 通过强引用传递给第二个闭包。所以,你得弱传。

不要忘记将 TypeOfSelf 更改为您所在的 class 的名称。这是必需的,否则编译器将无法推断类型。

lazy var onCancel: CocoaAction = { (this: TypeOfSelf) in
    return CocoaAction { [unowned this] _ in
        return this.coordinator.pop()
    }
}(self)