2

我有这样的示例 ViewModel,我在 Instruments 中看到的是这样和类似的 ViewModel 正在泄漏内存

class SearchViewModel<T>: ObservableObject {

    @Published var searchTerm : String = ""
    @Published var results: [T] = []

    private var disposables = Set<AnyCancellable>()

    init() {

        _searchTerm.projectedValue
        //$searchTerm
            .debounce(for: .milliseconds(350), scheduler: DispatchQueue.global())
            .flatMap { [weak self] term -> AnyPublisher<[T], Never> in

                 self?.search(by: term) ?? Empty().eraseToAnyPublisher()
            }
            .print("searching")
            .receive(on: DispatchQueue.main)
            .assignNotRetain(to: \.results, on: self)
            //.assign(to: \.results, on: self)
            .store(in: &disposables)

    }

    open func search(by term: String) -> AnyPublisher<[T], Never> {
        fatalError()
    }
}

我在 flatMap 中添加了 [weak self] 并将 .assign(to) 更改为自定义 .assignNotRetain(to),它使用带有 [weak self] 的 sink 它泄漏较少(有 deinit 调用)但有更多 init 调用然后 deinit 调用!这会导致一次性用品:设置为不取消分配/取消订阅

它只是示例视图模型类似的方法,调用服务,然后通过接收器观察输出,分配和更新 @Published 都发生泄漏内存和一次性用品通常不会被释放,所以我应该在 View onDisappear 中手动取消 AnyCancellable 吗?

4

0 回答 0