【发布时间】:2020-12-18 19:26:26
【问题描述】:
我有一组图像,需要使用不同的混合选项合并这些图像。我发现,在此过程中,内存不会在循环的每个步骤中释放。即使没有对创建的图像的引用。我的应用程序在此过程中崩溃,因为我有许多图像要合并。有没有什么解决方法或技巧可以在不增加内存的情况下做到这一点? 可以用下面的代码重现:
import UIKit
import CoreImage
class ViewController: UIViewController {
var images =
[
UIImage.init(color: UIColor.green, size: CGSize(width: 2048, height: 1152))!,
UIImage.init(color: UIColor.green, size: CGSize(width: 2048, height: 1152))!,
UIImage.init(color: UIColor.green, size: CGSize(width: 2048, height: 1152))!,
UIImage.init(color: UIColor.green, size: CGSize(width: 2048, height: 1152))!,
UIImage.init(color: UIColor.green, size: CGSize(width: 2048, height: 1152))!,
]
override func viewDidLoad() {
super.viewDidLoad()
var result = UIImage.init(color: UIColor.blue, size: CGSize(width: 2048, height: 1152))!
for image in images {
//each step reference to previous result released, but memory is growing
result = merge(result, image)
sleep(1)
}
}
public func merge(_ back: UIImage, _ top: UIImage) -> UIImage {
var size = CGSize(width: 2048, height: 1152)
UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale)
let rec = CGRect(x: 0, y: 0, width: 2048, height: 1152)
back.draw(in: rec)
//multiply is just for example, it can be different blending option
top.draw(in: rec, blendMode: .multiply, alpha: 1)
var newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
}
extension UIImage {
public convenience init?(color: UIColor, size: CGSize) {
let rect = CGRect(origin: .zero, size: size)
UIGraphicsBeginImageContextWithOptions(rect.size, true, 0)
color.setFill()
UIRectFill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
guard let cgImage = image?.cgImage else {
return nil
}
self.init(cgImage: cgImage, scale: UIScreen.main.scale, orientation: Orientation.up)
}
}
带有虚拟图像和循环的数组。我在Instruments 中添加了 sleep 以便更好地查看它(没有 sleep 它具有相同的结果)
如您所见,内存每秒都在增加。 有什么方法可以让每一步的记忆保持在同一水平? 非常感谢!
【问题讨论】:
-
是的,它完成了工作,谢谢!
标签: ios swift xcode automatic-ref-counting