我尝试实现一些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?()
控制器正确弹出,但是即使{{1 }}数组为空。
我的协调器类如下:
SecondViewCoordinator
内存图显示以下内容:
有什么想法吗?
答案 0 :(得分:5)
在
onmouseleave
您在闭包内部强烈引用了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
。