我有这样的示例 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 吗?