Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 保持循环结束_Ios_Arrays_Swift_Reference_Retain - Fatal编程技术网

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)
中,您不会再做任何使不再需要的对象为零的事情。你刚刚过滤了数组并释放了不可到达角落中的对象。它正在工作。谢谢。我想了很久,但还没有看到明显的解决办法;)