我在实现协调器模式时尝试使用组合而不是委托。但是,当我从 childCoordinators 列表中删除协调器时,会导致内存泄漏。如何确保协调器自动释放?具体来说,我希望 coordinator.actions.sink 订阅能够正确终止,并且协调器能够从内存中清除。
// MARK: - BaseCoordinator
@MainActor
class BaseCoordinator: Coordinator {
let navigator: NavigatorType
var childCoordinators: [Coordinator] = []
var cancellables = Set<AnyCancellable>()
init(navigator: NavigatorType) {
self.navigator = navigator
}
func start() {
// Default implementation, can be overridden by subclasses
}
}
// MARK: - ExampleFlowCoordinator
final class ExampleFlowCoordinator: BaseCoordinator {
override func start() {
let coordinator = ExampleCoordinator()
add(coordinator)
coordinator.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .done:
remove(coordinator)
}
}
.store(in: &cancellables)
navigator.setRootViewController(coordinator.rootViewController, animated: true)
coordinator.start()
}
private func showExample2() {
let coordinator = ExampleCoordinator2()
coordinator.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .done:
remove(coordinator)
}
}
.store(in: &cancellables)
add(coordinator)
coordinator.start()
navigator.present(coordinator.rootViewController, animated: true) { [weak self] in
guard let self else { return }
remove(coordinator)
}
}
}
在showExample2()函数中,当执行remove(coordinator)时,协调器成功从childCoordinators中移除。然而,由于 coordinator.actions.sink,协调器继续存在于内存中(如果我删除这部分,它会成功工作)。
这里的解决方案是去掉
childCoordinators: [Coordinator]
数组。联合体系统将确保协调器中任何需要保留的资源都将被保留。
当需要关闭协调器时,父协调器可以取消适当的可取消项,或者子协调器可以发送完成事件。