懒惰的CocoaAction没有内存泄漏#2方式

时间:2017-11-29 12:27:05

标签: ios action rx-swift

RxSwift是一个强大的功能,但有时候我会把自己射到腿上。 问题包括Resource count和对象释放。 我想在View Model中使用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)

1 个答案:

答案 0 :(得分:0)

在这两种情况下,您都需要将弱引用传递给CocoaAction以避免保留周期。你的第一个案例是有效的,因为你将无主self传递给第一个闭包,最终传递给第二个闭包而不增加保留计数。在第二种情况下,将self作为名为this的参数传递给闭包,并将this传递给具有强引用的第二个闭包。所以,你必须把它传递给它。

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

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