在我的 ViewModel 中使用线程时,我在我的应用程序中遇到了一个奇怪的行为。似乎 Thread.init 中发生了一些事情,即使调用 Thread 对象的 deinit(我什至没有启动线程)也会导致内存泄漏。
我对 Swift 比较陌生,所以这可能是我的错,但我不知道为什么。我有两个通过 NavigationView 链接在一起的视图。子 View 有一个 ViewModel,它在调用初始化方法时创建一个 Thread 并在调用反初始化方法时销毁 Thread 对象。当子 View “关闭”时,会调用 ViewModel 的去初始化方法。导航回父视图后,我可以在 Xcode 的内存分析器中看到新的内存泄漏
我在下面发布了一个重现此问题的小示例
HomeView:(主视图)
import SwiftUI
struct HomeView: View {
@State private var showView = false
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: TestView(showView: self.$showView), isActive : self.$showView) {
Text("Open MainView")
}.isDetailLink(false)
.navigationBarTitle("Home")
}
}
}
}
TestView:(子视图)
import SwiftUI
struct TestView: View {
@Binding var showView : Bool
@StateObject var mainViewModel = TestViewViewModel()
var body: some View {
Button("Back") {
showView = false
}.onAppear(perform: {
mainViewModel.initViewModel()
})
.onDisappear(perform: {
mainViewModel.deinitViewModel()
})
}
}
视图模型:
import Foundation
class TestViewViewModel: ObservableObject {
private var testThread: TestThread?
public func initViewModel() {
testThread = TestThread.init()
}
public func deinitViewModel() {
testThread?.cancel()
testThread = nil
}
/*+++++++++++++++*/
/*+ Test thread +*/
/*+++++++++++++++*/
private class TestThread: Thread {
override init(){
print("Init RenderThread")
}
deinit {
print("deinit RenderThread")
}
override func main() {
}
}
}
就是这样,不涉及任何魔法,但是当单击子视图中的“后退”按钮时,似乎不会在 ViewModel 的线程中被垃圾收集。任何提示可能有什么问题?这是一个错误还是我必须手动发布一些东西?