将UIview转换为UIimage导致内存泄漏

4

我正在开发一个iPhone应用程序,使用coverFlow视图,当应用程序构建卡片时,它使用UIView添加标签和其他内容。然后,我使用以下代码将UIView转换为UIImage:

UIGraphicsBeginImageContext(imageView.bounds.size);
[imageView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// returning the UIImage
return viewImage;

每次我重新绘制Coverflow时,内存都会大量增加,即使我dealloc CoverFlow视图也无法减少内存。我认为内存泄漏是在我添加的代码中,你认为呢?

2
我也遇到了同样的问题,并向苹果提出了一份报告。由于重复问题,该报告已关闭,所以你并不孤单。 - Chip Coons
你能解决这个问题吗?我也遇到了同样的问题。 - Steven Baughman
我也遇到了同样的问题。请帮帮我。我们该如何解决这个问题? - arundevma
3个回答

2

根据您提供的代码片段,没有明显的内存泄漏。由于UIGraphicsBeginImageContext()的原因,该操作不能在后台线程上执行,因此您应该使用NSAutoreleasePoolUIGraphicsGetImageFromCurrentContext()的返回值是自动释放的)。缺乏进一步的信息,无法确定内存泄漏可能出现在哪里 - 我建议您查看最终拥有viewImage对象的任何对象,并确保在保留UIImage时正确释放它。


0

0
那些想要将多个 UIView 转换为 UIImage,但是遇到内存泄漏问题的人可以使用 autoreleasepool 来解决这个问题。 例如:将所有的子视图都转换为 UIImage。
for subview in superView.subviews {
     autoreleasepool {
        let outputImage = subview.asImage()
     }
}


extension UIView {
    func asImage() -> UIImage? {
        if #available(iOS 10.0, *) {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        } else {
            UIGraphicsBeginImageContext(self.frame.size)
            self.layer.render(in:UIGraphicsGetCurrentContext()!)
            guard let image = UIGraphicsGetImageFromCurrentImageContext() else {
                return nil
            }
            UIGraphicsEndImageContext()
            guard let cgImage = image.cgImage else {
                return nil
            }
            return UIImage(cgImage: cgImage)
        }
    }
}



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接