没有内存泄漏的惰性 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()
}
}()
Controller
和 View Model
从内存中删除 - 太棒了!
当我尝试使用外部 self
值时出现问题(对象没有删除,因为动作捕获强 reference
到 self
)。如何避免在这里循环?
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)
RxSwift
是一个强大的功能,但有时我会搬起石头砸自己的腿。
问题在于 Resource count
和对象释放。
我想在视图模型中将 lazy var
用于 CocoaAction
。它在此流程中运行良好:
lazy var onCancel: CocoaAction = { [unowned self] _ in
return CocoaAction {
return self.coordinator.pop()
}
}()
Controller
和 View Model
从内存中删除 - 太棒了!
当我尝试使用外部 self
值时出现问题(对象没有删除,因为动作捕获强 reference
到 self
)。如何避免在这里循环?
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)