xcode swiftui over Image中的内存泄漏警告

fiei3ece  于 2023-03-19  发布在  Swift
关注(0)|答案(1)|浏览(144)

我正在制作一个照片编辑器应用程序,在Xcode和instruments中收到泄漏警告。我不确定我做错了什么,或者是否有任何错误。我复制了下面的错误。

@MainActor
class Model: ObservableObject{
    
    @Published var photosPickerItem: PhotosPickerItem? {
        didSet{
            Task{
                guard let photosPickerItem = photosPickerItem else {
                    return
                }
                try await loadTransferrable(from: photosPickerItem)
            }
        }
    }
    @Published var imageData: Data?
    
    func loadTransferrable(from item: PhotosPickerItem) async throws{
        if (item.supportedContentTypes.contains(UTType.image)) || (item.supportedContentTypes.contains(UTType.jpeg)) ||
            (item.supportedContentTypes.contains(UTType.png)) ||
            (item.supportedContentTypes.contains(UTType.webP)) ||
            (item.supportedContentTypes.contains(UTType.tiff)){
            if let data = try await item.loadTransferable(type: Data.self){
                imageData = data
            }
        }
    }
    
    func clearImage(){
        imageData = nil
    }
}

struct ContentView: View {
    @State var isShowingPicker = false
    @StateObject var model = Model()
    var body: some View {
        ZStack {
            if model.imageData != nil{
                let uiimage = UIImage(data: model.imageData!)
                Image(uiImage: uiimage!).resizable().scaledToFit()
            }
            HStack{
                Button(action: {
                    isShowingPicker.toggle()
                }, label: {
                    Text("Picker Button")
                })
                
                Button(action: {
                    model.clearImage()
                }, label: {
                    Text("Clear Button")
                })
            }
        }.photosPicker(isPresented: $isShowingPicker, selection: $model.photosPickerItem)
    }
}

errors i'm getting我在清除imageData并将其设置回nil后收到这些错误。
如果这真的是一个内存泄漏,我想以某种方式处理它,但我不知道。无论如何,感谢您的帮助:)

4dbbbstv

4dbbbstv1#

在SwiftUI中,你可以使用修饰符.task(id: model.photosPickerItem)而不是Task来启动异步工作,这样当id参数改变时,它会自动取消并重新启动。
另外,你的引用类型中有后台工作的函数,通常不会是@MainActor,因为异步函数会在主线程上运行,所以你可能根本就没有考虑引用类型。
也就是说,内存泄漏可能是UIImage init,因为我们不应该在View init或body内部初始化对象。

相关问题