【发布时间】:2019-12-29 11:31:30
【问题描述】:
我想知道如何在以下情况下避免保留循环:
private func setupDismissCallbacks() {
// inner func
func dismiss() {
self.videoExporter?.cancel()
self.rootViewController.dismiss(animated: true, completion: nil)
self.delegate?.childCoordinatorDidFinish(self)
}
// first clousre
saveModalViewController.onButtonDismiss = { [weak self] in
// not really using `self` here
guard let self = self else { return }
dismiss()
}
// second clousre
saveModalViewController.onDimmedAreaDismiss = { [weak self] in
// not really using `self` here
guard let self = self else { return }
dismiss()
}
}
我有一个函数setupDismissCallbacks,它监听来自saveModalViewController 自属性的两个回调。 dismiss() 是 setupDismissCallbacks 内部的一个内部函数,我用来访问 self 值。
但在 onButtonDismiss 和 onDimmedAreaDismiss 闭包中,我无法访问 self 来调用 dismiss,我无法将 [weak self] 添加到 dismiss 函数中,因为它是一个函数。
如何验证dismiss 内部的调用不会导致保留循环?
【问题讨论】:
-
"我不访问 self 来调用
dismiss" 你认为dismiss()调用如何知道要操作哪个实例? IE。当它被调用时,它的self的值是多少? -
@Alexander 不是类函数,调用
self.dismiss()会得到Value of type 'SaveCoordinator' has no member 'dismiss' -
@Alexander 在函数内部
-
哦,我没注意到。你的内在功能捕捉自我。您的两个闭包捕获了该内部函数(包括它所包含的上下文,其中包括
self)。由于saveModalViewController强烈引用了您的两个闭包(我假设self强烈引用了这两个闭包),因此您有一个保留周期。 -
有办法避免吗?我正在尝试减少重复代码。一个想法是简单地将dismiss() 放在类范围内,但是类可能有一些dismiss 选项,因此将其保留在函数中使其保持在上下文中,由于创建保留周期
标签: ios swift weak-references retain-cycle weak