2015-06-23 10 views
15

Swift Codice

Quando arriviamo uno screenshot di un'UIView, usiamo questo codice di solito:rapida UIGraphicsGetImageFromCurrentImageContext non può liberare la memoria

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

Problema

drawViewHierarchyInRect & & UIGraphicsGetImageFromCurrentImageContext genererà un immagine nel contesto corrente, ma la memoria sarà non rilasciata quando è chiamata UIGraphicsEndImageContext.

La memoria continua ad aumentare fino a quando l'app si arresta in modo anomalo.

Anche se c'è una parola UIGraphicsEndImageContext chiamerà CGContextRelease automaticamente", non funziona.

Come posso rilasciare la memoria drawViewHierarchyInRect o UIGraphicsGetImageFromCurrentImageContext utilizzato

Or?

C'è qualche cosa che genera screenshot senza drawViewHierarchyInRect?

Già provato

1 Rilascio automatico: non funzionare

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

2 UnsafeMutablePointer: non funziona

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) 
+3

Vedo che hai nessuna risposta dopo 2 mesi, e penso che sto ottenendo lo stesso problema. Non penso che tu abbia trovato una soluzione o una soluzione alternativa? – Martin

+2

Ho riscontrato lo stesso problema e ho cercato una soluzione. – Hope

risposta

3

Ho risolto questo problema mettendo operazioni di immagine in un'altra coda!

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) 
    } 
} 
-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! 
} 
} 
+0

semplicemente non mi piace l'operatore BANG alla fine del codice "return resizedImage!" come faccio a tirare fuori il BANG ....? –

+1

Benvenuti in StackOverflow e grazie per l'aiuto. Ma per favore aumenta la tua risposta solo in codice con alcune prose di spiegazione, al fine di evidenziare le parti più interessanti. – Yunnosch