2015-06-23 9 views
15

Swift Code

Wenn wir einen Screenshot von einem UIView zu erhalten, verwenden wir diesen Code in der Regel:rasche UIGraphicsGetImageFromCurrentImageContext kann nicht loslassen Speicher

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

Problem

drawViewHierarchyInRect & & UIGraphicsGetImageFromCurrentImageContext wird eine generieren Bild im aktuellen Kontext, aber Speicher wird nicht freigegeben, wenn wenn UIGraphicsEndImageContext aufgerufen wird.

Speicherverbrauch wird weiter erhöht, bis die App abstürzt.

Obwohl es ein Wort ist UIGraphicsEndImageContext wird CGContextRelease rufen automatisch“, funktioniert es nicht.

Wie kann ich den Speicher freigeben drawViewHierarchyInRect oder UIGraphicsGetImageFromCurrentImageContext

verwendet

Oder?

Gibt es trotzdem zu erzeugen Screenshot ohne drawViewHierarchyInRect?

Bereits versucht

1 Auto-Release: nicht arbeitet

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

2 UnsafeMutablePointer: Arbeit nicht

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

Ich sehe, Sie haben keine Antworten nach 2 Monaten, und ich glaube, ich bin das gleiche Problem bekommen. Ich nehme nicht an, dass Sie eine Reparatur oder einen Workaround gefunden haben? – Martin

+2

Ich habe das gleiche Problem angetroffen und suche nach einer Lösung. – Hope

Antwort

3

ich dieses Problem gelöst, indem in einer anderen Warteschlange Bildoperationen setzen!

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

Ich mag einfach nicht den BANG-Operator am Ende des Codes "return resizedImage!" wie würde ich den BANG raus nehmen ....? –

+1

Willkommen bei StackOverflow und vielen Dank für Ihre Hilfe. Aber bitte erweitern Sie Ihre Code-only-Antwort mit einer Erklärungsprosa, um die interessantesten Teile hervorzuheben. – Yunnosch

Verwandte Themen