我会尝试尽可能简单地解释这一点。我制作了一个根据用户操作修改 UIImage 的应用程序。
为了能够共享/保存生成的图像,我在视图中添加了一个共享链接。
每次用户对图像进行更改时,应用程序都会消耗永远不会释放的内存。
当我删除 ShareLink() 时,内存被释放并按预期工作。
我是否错过了有关 ShareLink() 工作原理的内容?我已经阅读了Apple文档,但我没有得到任何启发。
顺便说一句,我正在为我的控制器使用 @State 变量,这应该没问题,因为它不是 ObservableObject。
这是我的应用程序的基本结构,非常简化。
class ImageController() {
func modifyImage(photo: UIImage?) -> async UIImage? {
// do stuff here
return resultingUIImage
}
}
struct ContentView: View {
@State private var photo: UIImage?
@State private var imageController: ImageController()
var body: some View {
VStack {
Image(uiImage: photo)
HStack {
Button("Modify the image") {
Task {
let newPhoto = await modifyImage(photo)
DispatchQueue.main.async {
self.photo = newPhoto
}
}
}
// when removing ShareLink() below the app doesn't leak memory
ShareLink(item: Image(uiImage: photo), preview: SharePreview("Description", image: Image(uiImage: photo))
}
}
}
}
我现在已经解决了,但不确定这是否是正确的方法。这就是我所做的:
struct ShareableJpeg {
let imageData: Data
}
extension ShareableJpeg: Transferable {
enum ShareError: Error {
case failed
}
static var transferRepresentation: some TransferRepresentation {
DataRepresentation(exportedContentType: .jpeg) { object in
return object.imageData
}
}
}
@State var shareableJpeg: ShareableJpeg?
ShareLink(item: shareableJpeg, preview: SharePreview("Description", image: Image("AppIcon"))) {
Label("Share", systemImage: "square.and.arrow.up")
}
let resultingImage = await imageController.applyStuff(image)
if let jpegData = image.jpegData(compressionQuality: 0.9) {
shareableJpeg = ShareableJpeg(imageData: jpegData)
}