Quartz PDF API führt zu Speicherabstürzen

Ich habe Absturzprobleme mit der Quartz PDF-API für iOS. Im Moment kompiliere ich mit dem SDK 4.0 GM Seed und laufe auf meinem 3.2 iPad (ich habe versucht, das 3.2 SDK mit identischen Ergebnissen zu verwenden).

Aller von mir verwendete Code basiert auf der Apple Quartz-Standarddokumentation und aus verschiedenen Quellen im Internet. Ich kann mir also nicht vorstellen, dass ich etwas völlig anderes oder falsches mache.

Der Code läuft perfekt im Simulator (alle Versionen, es ist eine Universal-App) und sogar während der Verwendung der Funktion "Speicherwarnung simulieren". Ich habe das Tool "Lecks" verwendet und es wurden keine Lecks gefunden. Build and Analyze findet auch nichts. In meiner Bibliothek ist kein Absturz- oder Speicherproblem mehr vorhanden.

All das lässt mich glauben, dass das Gerät nicht mehr genügend Speicher hat. Dies geschieht nach dem Durchlaufen von beispielsweise 50 PDF-Seiten, wobei etwa 35% eine Art Bild haben (einige ganze Seite, einige Ikone). Es stürzt auf keiner bestimmten Seite ab. Das PDF, das ich lade, hat ungefähr 75 Seiten und eine Größe von 3,5 MB.

Ich habe ähnliche Themen auf dieser Site und im Internet durchgesehen und einige der Ratschläge im folgenden Code angewendet. Ich gebe jetzt die PDF-Dokumentreferenz bei jedem Seitenwechsel frei und behalte / gebe keine Seitenreferenz mehr frei. Ich habe auch den Bildwechsel von CGImages zu UIGraphicsGetImageFromCurrentImageContext vereinfacht. Ich habe verschiedene Implementierungen zum Wechseln der Bilder ausprobiert, einschließlich des vollständigen Ersetzens der pdfImgView durch eine neu zugewiesene temporäre Instanz (unter Verwendung von[[UIImageView alloc] iniWithImage:UIGraphicsGetImageFromCurrentImageContext()]), mit dem Setter für pdfImgView und Freigabe des Temp. Alle Varianten bestehen die Leck- und Analysetests, weisen jedoch immer noch dasselbe Absturzverhalten auf.

So, bevor ich mich von PDFs entferne, gibt es etwas, das ich ausprobieren sollte oder etwas, das ich vermisse?

View-Controller-Code, der in Interface-Handlern zum Auslagern von Seiten und beim ersten Laden aufgerufen wird:

[self drawPage];

// ...animation code...simple CATransition animation...crashes with or without

// scrollView is a UIScrollView that is a subview of self.view
[scrollView.layer addAnimation:transition forKey:nil];
// pdfImgView is a UIImageView that is a subview of scrollView
pdfImgView.image = UIGraphicsGetImageFromCurrentImageContext();

drawPage-Methode zum Konfigurieren und Zeichnen von PDF-Seiten in den Kontext:

[CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("BME_interior.pdf"), NULL, NULL);
pdfRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); // instance variable, not a property
CFRelease(pdfURL);
CGPDFPageRef page = CGPDFDocumentGetPage(pdfRef, currentPage);

CGRect box = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
// ...setting scale and imageHeight, both floats...

if (UIGraphicsBeginImageContextWithOptions != NULL) {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.frame.size.width, imageHeight), NO, 0.0);
} else {
    UIGraphicsBeginImageContext(CGSizeMake(self.view.frame.size.width, imageHeight));
}
CGContextRef context = UIGraphicsGetCurrentContext();
NSLog(@"page is %d, context is %d, pdf doc is %d, pdf page is %d", currentPage, context, pdfRef, page); // all prints properly

// ...setting up scrollView for new page, using same instance...

CGContextTranslateCTM(context, (self.view.frame.size.width-(box.size.width*scale))/2.0f, imageHeight);
CGContextScaleCTM(context, scale, -1.0*scale);

CGContextSaveGState(context);
CGContextDrawPDFPage(context, page);
CGContextRestoreGState(context);

CGPDFDocumentRelease(pdfRef);
pdfRef = NULL;

Antworten auf die Frage(4)

Ihre Antwort auf die Frage