Swift Joint:通过协调器模式和订阅管理防止内存泄漏

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

我在实现协调器模式时尝试使用组合而不是委托。但是,当我从 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,协调器继续存在于内存中(如果我删除这部分,它会成功工作)。

ios swift combine coordinator-pattern
1个回答
0
投票

这里的解决方案是去掉

childCoordinators: [Coordinator]
数组。联合体系统将确保协调器中任何需要保留的资源都将被保留。

当需要关闭协调器时,父协调器可以取消适当的可取消项,或者子协调器可以发送完成事件。

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