我有一个示例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]一起使用,它的泄漏较少(有deinit调用),但有更多的init调用然后取消通话!这导致一次性用品:设置为未取消分配/取消的预订
这只是示例视图模型的类似方法,即调用serivce,然后通过接收器观察输出,进行分配和更新@Published碰巧会泄漏内存,而一次性物品通常不会被释放,所以我应该在View onDisappear中手动取消AnyCancellable吗?