Ios 保持循环结束
我试图实现协调器模式的一些变体,但在闭包时我面临保留周期的问题。看起来是这样的:Ios 保持循环结束,ios,arrays,swift,reference,retain,Ios,Arrays,Swift,Reference,Retain,我试图实现协调器模式的一些变体,但在闭包时我面临保留周期的问题。看起来是这样的: func goTo() { let coord = SecondViewCoordinator(nav: navigationController) add(coord) coord.start() coord.deinitIfNeeded = { [weak self] in guard let self = self else { return }
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)
}
}
正如您所看到的,我设置了deinitifneed
,然后,如果在SecondViewCoordinator
中调用deinitifneed?()
控制器将正确弹出,但对SecondViewCoordinator
的引用仍然存在,即使childCoordinators
数组为空
我的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)
}
}
班级协调员{
弱var导航控制器:UINavigationController?
var childCoordinators:[协调员]=[]
需要的变量定义:(()->())?
初始化(导航:UINavigationController?){
self.navigationController=nav
}
func add(uu协调员:协调员){
childCoordinators.append(协调员)
}
func free(uu协调员:协调员){
childCoordinators=childCoordinators.filter({$0!==Coordinators})
}
}
内存图显示了以下内容:
有什么想法吗?
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.DeinitiFneedd
设置为nil
。简单的复制路径总是很好:)在func free(uu-coordinator:coordinator)
中,您不会再做任何使不再需要的对象为零的事情。你刚刚过滤了数组并释放了不可到达角落中的对象。它正在工作。谢谢。我想了很久,但还没有看到明显的解决办法;)