UIGraphicsGetImageFromCurrentImagecontext memory-leak-mit-Vorschau
Ich versuche zu schaffen, Vorschau-Bilder der Seiten in einem PDF
aber ich habe einige Probleme mit der Freigabe von Speicher.
Schrieb ich ein einfaches test-Algorithmus, der Zyklen auf das problem,
die app stürzt in der Nähe des 40th iteration:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:@"myPdf.pdf"];
CFURLRef url = CFURLCreateWithFileSystemPath( NULL, (CFStringRef)pdfPath, kCFURLPOSIXPathStyle, NO );
CGPDFDocumentRef myPdf = CGPDFDocumentCreateWithURL( url );
CFRelease (url);
CGPDFPageRef page = CGPDFDocumentGetPage( myPdf, 1 );
int i=0;
while(i < 1000){
UIGraphicsBeginImageContext(CGSizeMake(768,1024));
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
CGContextFillRect(context,CGRectMake(0, 0, 768, 1024));
CGContextSaveGState(context);
CGContextTranslateCTM(context, 0.0, 1024);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);
//--------------------------
//The problem is here (without this line the application doesn't crash)
UIImageView *backgroundImageView1 = [[UIImageView alloc] initWithImage:UIGraphicsGetImageFromCurrentImageContext()];
//--------------------------
UIGraphicsEndImageContext();
[backgroundImageView1 release];
NSLog(@"Loop: %d", i++);
}
CGPDFDocumentRelease(myPdf);
Dem oben erwähnten Grundsatz scheint zu generieren, die ein Speicher-Leck,
allerdings Instrumente nicht zeigen, Probleme mit dem Speicher;
Kann ich Flucht aus dieser Art von Fehler?kann jemand mir erklären, in welcher Art und Weise?
Gibt es andere Möglichkeiten zu zeigen, eine Vorschau einer pdf-Datei?
UPDATE
Ich denke, das problem ist nicht die Veröffentlichung von UIImage
erstellt, indem die Methode UIGraphicsGetImageFromCurrentImageContext()
aber die Veröffentlichung UIImageView
mit diesem erstellt autorelease Bild.
Habe ich aufgeteilt die code-Zeile in drei Schritten:
UIImage *myImage = UIGraphicsGetImageFromCurrentImageContext();
UIImageView *myImageView = [[UIImageView alloc] init];
[myImageView setImage: myImage]; //Memory Leak
Den ersten und zweiten Zeilen nicht schaffen, Speicherlecks, so dass ich denke, dass die Methode UIGraphicsGetImageFromCurrentImagecontext ist nicht das problem.
Ich habe auch versucht, wie folgt, aber das problem besteht weiterhin:
UIImageView *myImageView = [[UIImageView alloc] initWithImage:myImage];
Ich denke, es ist ein memory leak in der Version eines UIImageView, die enthält ein UIImage mit dem autorelease-Eigenschaft.
Ich zu schreiben versucht, mein Objekt UIImageView Erben ein UIView wie in diesem thread.
Diese Lösung funktioniert, ist aber nicht besonders elegant, es ist ein workaround, ich würde es vorziehen, um das Objekt UIImageView die Lösung des Speicher-Problems.
InformationsquelleAutor der Frage Alessandro | 2011-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem ist Folgendes:
liefert einen autoreleased
UIImage
. Der autorelease-pool hält Sie auf dieses Bild, bis Sie Ihren code gibt die Steuerung an die runloop, die Sie nicht tun, für eine lange Zeit. Um dieses problem zu lösen, müssen Sie diesen erstellen und drain eine frische autorelease-pool bei jeder iteration (oder alle paar Iterationen) von Ihremwhile
Schleife.InformationsquelleAutor der Antwort Ole Begemann
Ich weiß, es ist eine alte Frage, aber ich schlug meinen Kopf gegen die Wand auf diese für ein paar Stunden. In meiner app immer wieder ruft
in einer Schleife hält an der Speicher-trotz meiner Berufung image = nil; Nicht sicher, wie lange die app halten Sie den Speicher, bevor Sie zu befreien, aber es ist sicherlich lange genug für meine app, um eine Erinnerung Warnung, dann Absturz.
Habe ich es geschafft, es zu lösen, schließlich durch die Verpackung den code aufruft /verwendet das Bild von UIGraphicsGetImageFromCurrentImagecontext() in @autoreleasepool. Also ich habe:
Hoffe, dass vielleicht jemand helfen.
InformationsquelleAutor der Antwort CharlesA
Ist dieser code läuft auf dem main thread? Die Dokumentation der UIGraphicsGetImageFromCurrentImagecontext (link) sagt, es muss auf diese Weise.
InformationsquelleAutor der Antwort Ricardo de Cillo
Für zukünftige Referenz, hier ist, was ich getan habe um dieses Problem zu lösen (getestet im Swift 4).
War ich den Aufruf der Funktion weiter unten für jedes neue Bild aus dem internet heruntergeladen (auf einem utility-queue). Vor der Umsetzung der autorelease pool es Abstürzen würde, nach der Verarbeitung über 100.
Einfachheit halber, in der resizeImage Funktion habe ich entfernt, benötigt code, außer für den autoreleasepool, und der Teil, der war undicht.
Ich hoffe, das hilft!
InformationsquelleAutor der Antwort MMV
Ich habe das gleiche problem, die Arbeit mit großen Bildern. Hinzufügen einer Polsterung, ein Bild oder das anwenden eines filters führte mit 200MB memory allocation, ohne es loszulassen, während das Bild auf dem Bildschirm angezeigt.
Fand einen funktionierenden Weg, um dieses problem zu beheben:
Habe auch versucht es mit UIImagePNGRepresentation aber es scheint nicht, lassen Sie die Zuteilung auch nicht.
InformationsquelleAutor der Antwort iamszabo
Ihre Linie der crash-Sie können es zu aktualisieren, wie folgt
Holen Sie sich ein UIimage aus der Schleife
rendered_image = UIGraphicsGetImageFromCurrentImagecontext();
InformationsquelleAutor der Antwort Abdul Karim Khan