我尝试实现一些Coordinator模式的变体,但是我面临闭包中保留周期的问题。看起来像这样:
func goTo() {
let coord = SecondViewCoordinator(nav: navigationController)
add(coord)
coord.start()
coord.deinitIfNeeded = { [weak self] in
guard let self = self else { return }
self.free(coord)
}
}
您可以看到我设置了deinitIfNeeded
,然后,如果在SecondViewCoordinator
调用中正确弹出了deinitIfNeeded?()
控制器,但是即使SecondViewCoordinator
数组为空,对childCoordinators
的引用仍然存在。
我的协调器类如下:
class Coordinator {
weak var navigationController: UINavigationController?
var childCoordinators: [Coordinator] = []
var deinitIfNeeded: (() -> ())?
init(nav: UINavigationController?) {
self.navigationController = nav
}
func add(_ coordinator: Coordinator) {
childCoordinators.append(coordinator)
}
func free(_ coordinator: Coordinator) {
childCoordinators = childCoordinators.filter({ $0 !== coordinator })
}
}
内存图显示此:
任何想法?
输入
coord.deinitIfNeeded = { [weak self] in
guard let self = self else { return }
self.free(coord)
}
您在闭包内强烈引用coord
。尝试这样的事情;
coord.deinitIfNeeded = { [weak self, weak coord] in
guard let self = self, let coord = coord else { return }
self.free(coord)
}
[内存图给出了这种情况的提示(右侧说,强引用在闭包中。)
您也可以在闭包内将coord.deinitIfNeeded
设置为nil
。