2010-12-16 4 views
4

Ich verwende diesen Code, um Screenshots des Fensters zu verschiedenen Zeiten zu erhalten und die UIImage erstellt in ein Array, das an einen anderen UIViewController weitergegeben wird, so dass sie alle wieder angezeigt werden können ein Gitter. Ich versuche, die UIImage zu lösen und die Speichernutzung geht nie nach unten ... wie kann ich das Bild verwende hier einmal, und das Eigentum behalten, damit ich den Speicher freigeben kann, wenn es angezeigt wirdBehalten Besitz von UIImage erstellt mit UIGraphicsGetImageFromCurrentImageContext

UIGraphicsBeginImageContext(self.window.bounds.size);
[self.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[imagesArray addObject:image];
[image release];

+1

UIImage * skaliertesBild = [UIGraphicsGetImageFromCurrentImageContext() beibehalten]; Würde das helfen ?? –

Antwort

9

UIGraphicsGetImageFromCurrentImageContext() returns " ein Autoreleased Bildobjekt, das den Inhalt des aktuellen Bitmap-Grafikkontexts enthält. "

Wenn Sie das Bild zu Bildern hinzufügenArray, NSMutableArray behält es auf, und es ist alles was Sie brauchen. Der Speicher wird freigegeben, wenn das Bild aus dem Array entfernt wird.

Sie sollten nicht Aufruf Freigabe auf Bild.

0

Ich bekam eine seltsame UIImage Speicherverlust mit einem beibehaltenen UIImage Bild von UIGraphicsGetImageFromCurrentImageContext() in einem Hintergrund-Thread. Das Problem stellte sich heraus, dass Sie diese Funktion nur aus dem Hauptthread Ihrer Anwendung aufrufen sollten. In acht nehmen.

+0

Pro Apple Dokumente, "Diese Funktion kann von jedem Thread Ihrer App aufgerufen werden." Wie hast du bestätigt, dass es nur vom Haupt-Thread aufgerufen werden sollte? – StephenT

2

Ich hatte einen Speicherabsturz auf UIGraphicsGetImageFromCurrentImageContext() ... wenn Sie eine Menge von ihnen erstellen und veröffentlichen, sollten Sie sie für jede Iteration in ein neues AutoReleasePool verpacken. Selbst das Ankreuzen des NSRunLoop war nicht genug für Apple/iOS, um auf Müll herumzuhelfen.

z.B.

for(...) 
{ 
    @autoreleasepool 
    { 
     UIImage* blah = UIGraphicsGetImageFromCurrentImageContext(); 
    } 
}