Memory management 在SwiftUI中加载多个UIImage时出现内存问题

Memory management 在SwiftUI中加载多个UIImage时出现内存问题,memory-management,swiftui,uiimage,Memory Management,Swiftui,Uiimage,我使用这个简单的代码从临时目录加载映像 每个新图像都需要大量内存才能可视化。 在这个项目中,我需要加载20-30个图像,因此我应该减少每个图像所需的内存,现在每个图像大约23mb 是否可以直接从其路径加载图像而不将其添加到内存?有什么建议吗?非常感谢 你想在应用程序中显示的任何内容都应该加载到内存中,所以我相信这方面没有什么可做的 在iOS上,UIImage的内存使用量与映像维度有关。例如,如果您有1920x1080映像,它将在内存中消耗大约8兆字节(1920*1080*4字节) 因为如中所

我使用这个简单的代码从临时目录加载映像



每个新图像都需要大量内存才能可视化。 在这个项目中,我需要加载20-30个图像,因此我应该减少每个图像所需的内存,现在每个图像大约23mb


是否可以直接从其路径加载图像而不将其添加到内存?有什么建议吗?非常感谢

你想在应用程序中显示的任何内容都应该加载到内存中,所以我相信这方面没有什么可做的

在iOS上,UIImage的内存使用量与映像维度有关。例如,如果您有1920x1080映像,它将在内存中消耗大约8兆字节(1920*1080*4字节)

因为如中所述,“内存使用与图像的尺寸有关,而与文件大小无关。”

因此,作为一种解决方案,您可以使用较低维度的图像,也可以在显示之前对图像进行降采样

下面是一个用于对图像进行下采样的示例函数


它工作得很好。我已经想过要沿着这条路走下去,但我错了,因为我不相信记忆的使用会如此低劣。再次感谢你!
struct AddNewMedia: View {

      @State var filename:String

      func imageFullPath(filename:String)->UIImage {
           let pathToTemoDir = FileManager.default.temporaryDirectory.appendingPathComponent(filename)
               return UIImage(contentsOfFile: pathToTemoDir.path)!
      }

         var body: some View {

             Image(uiImage: self.imageFullPath(filename: filename))
               .resizable()
               .scaledToFit()
     }
}
func downsample(imageAt imageURL: URL,
                to pointSize: CGSize,
                scale: CGFloat = UIScreen.main.scale) -> UIImage? {

    // Create an CGImageSource that represent an image
    let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary
    guard let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions) else {
        return nil
    }
    
    // Calculate the desired dimension
    let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scale
    
    // Perform downsampling
    let downsampleOptions = [
        kCGImageSourceCreateThumbnailFromImageAlways: true,
        kCGImageSourceShouldCacheImmediately: true,
        kCGImageSourceCreateThumbnailWithTransform: true,
        kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels
    ] as CFDictionary
    guard let downsampledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions) else {
        return nil
    }
    
    // Return the downsampled image as UIImage
    return UIImage(cgImage: downsampledImage)
}