我正在制作一个照片编辑器应用程序,在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后收到这些错误。
如果这真的是一个内存泄漏,我想以某种方式处理它,但我不知道。无论如何,感谢您的帮助:)
1条答案
按热度按时间4dbbbstv1#
在SwiftUI中,你可以使用修饰符
.task(id: model.photosPickerItem)
而不是Task
来启动异步工作,这样当id参数改变时,它会自动取消并重新启动。另外,你的引用类型中有后台工作的函数,通常不会是
@MainActor
,因为异步函数会在主线程上运行,所以你可能根本就没有考虑引用类型。也就是说,内存泄漏可能是
UIImage
init,因为我们不应该在View init或body内部初始化对象。