首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIGraphicsImageRenderer工作后释放内存

UIGraphicsImageRenderer工作后释放内存
EN

Stack Overflow用户
提问于 2021-05-16 02:23:13
回答 1查看 373关注 0票数 1

我有很多图像保存在一个Assets.xcassets.中我正在调整它们的大小,使它们变小。后来我不再需要这些图像了。图像没有显示,只是准备好了。因此,获得图像、调整图像大小并保持其大小的类现在已成功地获得了脱deinited

但是UIGraphicsImageRenderer后的内存调整了未发布的图像的大小。内存使用保持在相同的水平上。即使我根本没有使用这些图像,如下面的示例代码所示。我觉得有点不对劲。实际上,我调整了图像大小以使用更少的内存,但是相反--调整大小的图像使用更多的内存,并且在类所有者被删除之后它不会释放。

如何释放内存?

苹果文档说:"...An图像渲染器保存了核心图形上下文的缓存,所以重用同一个渲染器比创建新的渲染器更有效。“--但我不需要它!怎么关机?有28张照片似乎没什么大不了的。但是我有大约100到300个图像应该调整大小,裁剪和使用UIGraphicsImageRenderer的其他动作,在一天结束时使用大约800到900 Mb的内存,只是缓存一些渲染的工作已经完成。

你可以把下面的代码试一试。

代码语言:javascript
复制
class ExampleClass {
    
    func start() {
        Worker().doWork()
    }
}

class Worker {
    
    deinit {
        print("deinit \(Self.self)")
    }
    
    func doWork() {
        
        var urls: [String] = []
        _ = (1...28).map({ urls.append("pathToTheImages/\($0)") })
        // images with resolution 1024.0 x 1366.0 pixels
        
        for url in urls {
            let img = UIImage(named: url)!  // Memory usage: 11.7 MB
            //let cropped = resizedImage(original: img, to: UIScreen.main.bounds.size)
            //With this line above - Memory usage: 17.5 MB even after this class has been deinited
        }
    }
    
    // from 2048 × 3285 pixels >>> to >>> 768.0 x 1024.0 pixels  --- for iPad Pro (9.7-inch)
    func resizedImage(original: UIImage, to size: CGSize) -> UIImage {
        let result = autoreleasepool { () -> UIImage in
            let renderer = UIGraphicsImageRenderer(size: size)
            let result = renderer.image { (context) in
                original.draw(in: CGRect(origin: .zero, size: size))
            }
            return result
        }
        return UIImage(cgImage: result.cgImage!, scale: original.scale, orientation: original.imageOrientation)
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-05-16 03:27:55

资产目录并不打算供您使用。资产目录中图像的目的是直接显示它。如果您有很多图像需要加载、调整大小并保存到其他地方,而不需要显示,则需要将它们保存在顶级的应用程序包中,这样就可以调用不缓存图像的init(contentsOfFile:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67552708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档