我遇到了一个奇怪的行为,在我的应用程序中使用线程在我的ViewModel。在Thread中似乎发生了一些事情。即使调用Thread对象的deinit(我甚至没有启动线程),也会导致内存泄漏。
我对Swift比较陌生,所以这可能是我的错,但我不知道为什么。我有两个视图通过一个NavigationView链接在一起。子视图有一个ViewModel,它在初始化方法被调用时创建一个Thread,在去初始化方法被调用时销毁Thread对象。当子视图被“关闭”时,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()
})
}
}
ViewModel:
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() {
}
}
}
这不是魔术,但当点击子视图中的Back按钮时,它似乎不会在ViewModel的线程中被垃圾收集。有什么问题吗?这是一个bug还是有什么我必须手动释放?