ios swift uiimage uigraphicscontext

ios - swift UIGraphicsGetImageFromCurrentImageContext no puede liberar memoria



uiimage uigraphicscontext (2)

¡Solucioné este problema poniendo las operaciones de imagen en otra cola!

private func processImage(image: UIImage, size: CGSize, completion: (image: UIImage) -> Void) { dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) { UIGraphicsBeginImageContextWithOptions(size, true, 0) image.drawInRect(CGRect(origin: CGPoint.zero, size: size)) let tempImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() completion(image: tempImage) } }

código SWIFT

Cuando obtenemos una captura de pantalla de un UIView, usamos este código generalmente:

UIGraphicsBeginImageContextWithOptions(frame.size, false, scale) drawViewHierarchyInRect(bounds, afterScreenUpdates: true) var image:UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext()

Problema

drawViewHierarchyInRect && UIGraphicsGetImageFromCurrentImageContext generará una imagen en el contexto actual, pero la memoria no se liberará cuando se llame a UIGraphicsEndImageContext .

El uso de memoria continúa aumentando hasta que la aplicación falla.

Aunque hay una palabra, UIGraphicsEndImageContext llamará a CGContextRelease automáticamente ", no funciona.

¿Cómo puedo liberar la memoria drawViewHierarchyInRect o UIGraphicsGetImageFromCurrentImageContext utilizado

¿O?

¿Hay generadores de pantalla de todos modos sin drawViewHierarchyInRect ?

Ya probado

1 Auto release: no funciona

var image:UIImage? autoreleasepool{ UIGraphicsBeginImageContextWithOptions(frame.size, false, scale) drawViewHierarchyInRect(bounds, afterScreenUpdates: true) image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() } image = nil

2 UnsafeMutablePointer: no funciona

var image:UnsafeMutablePointer<UIImage> = UnsafeMutablePointer.alloc(1) autoreleasepool{ UIGraphicsBeginImageContextWithOptions(frame.size, false, scale) drawViewHierarchyInRect(bounds, afterScreenUpdates: true) image.initialize(UIGraphicsGetImageFromCurrentImageContext()) UIGraphicsEndImageContext() } image.destroy() image.delloc(1)


private extension UIImage { func resized() -> UIImage { let height: CGFloat = 800.0 let ratio = self.size.width / self.size.height let width = height * ratio let newSize = CGSize(width: width, height: height) let newRectangle = CGRect(x: 0, y: 0, width: width, height: height) UIGraphicsBeginImageContext(newSize) self.draw(in: newRectangle) let resizedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resizedImage! } }