保留关闭周期

问题描述 投票:0回答:1

我尝试实现一些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 })
    } 
}

内存图显示此:

enter image description here

任何想法?

ios arrays swift reference retain
1个回答
0
投票

输入

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

© www.soinside.com 2019 - 2024. All rights reserved.