在Swift中使用线程会导致内存泄漏

2022-01-28 02:11:08 标签 iosswiftmemory-leaksswift5xcode12.5

我遇到了一个奇怪的行为,在我的应用程序中使用线程在我的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还是有什么我必须手动释放?

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码