2 Stimmen

CGPDF iPhone/iPad Speicherprobleme

Ich kämpfe schon seit Ewigkeiten damit, einen funktionierenden PDF-Reader für iPhone/iPad zu entwickeln, aber das Ding hört einfach nicht auf, Speicher zu fressen. Es scheint, dass alle Seiten mit CGContextDrawPDFPage gezeichnet werden intern zwischengespeichert und nie freigegeben.

Ich bin nicht der Einzige, der dieses Problem hat: http://lists.apple.com/archives/quartz-dev/2010/Apr/msg00025.html

http://web.archiveorange.com/archive/v/SEb6acvPicMB2NdIjEd3

Eine Antwort aus dem ersten Thread:

Wenn es das ist, wofür ich es halte, ist es kein Leck, sondern ein Cache. Anstatt das PDF-Dokument zwischen den Aufrufen zu speichern, sollten Sie versuchen, das Dokument zu erstellen, die Seite abzurufen und zu zeichnen und dann das Dokument freizugeben, wenn Sie fertig sind.

Ich habe es ausprobiert, und es löst das Problem, aber es ist zu verdammt langsam. Wenn ich es auf die "normale" Weise mache (d.h. ohne CGPDFDocument für jede Zeichnung zu laden/freizugeben), funktioniert es gut und ziemlich schnell, bis ich die 4. oder 5.

Ich habe dieses Problem seit Ewigkeiten gegoogelt: Alle haben das gleiche Problem, aber anscheinend hat es niemand hinbekommen. Die einzigen Beispiele, die ich gefunden habe, laden ein einseitiges PDF, so dass offensichtlich alles gut funktioniert, bis man ein Dokument mit mehreren Seiten lädt (und natürlich, wenn das Ding Bilder enthält, stürzt es noch früher ab). Das macht mich wahnsinnig.

Also die Frage ist: wie genau handhaben Sie PDF-Zeichnung mit CGPDF in Ihrer Anwendung? Jede Hilfe würde sehr geschätzt werden. Danke!

5voto

Luke Mcneice Punkte 2992

Mein aktuelles Enterprise-Projekt basiert auf einem PDF-Reader. Ich gebe CGPDFDocument nicht frei und ich kann durch eine 14-seitige Apple PDF mit der App maxing bei 30mb blättern. Ich kann nicht geben Sie Code, aber ich kann Sie in die richtige Richtung zeigen.

Ich habe hier einen ähnlichen Thread gestartet: Schneller und schlanker PDF Viewer für iPhone / iPad / iOs - Tipps und Hinweise?

Einige Tipps:

-Speichern Sie alle Medien auf der Festplatte, wenn Sie können.

-Verwendung größerer Kachelgrößen beim Rendern auf TiledLayers

-Beachten Sie, dass Bilder schneller gerendert werden als eine CGPDFPageRef

-Verwendung von NSOperations zur Vorbereitung von Seiten im Voraus
der Zeit.

-Recycling von Seitenobjekten

-Schließen Sie alle offenen Kontexte, sobald Sie sie nicht mehr benötigen

-bei einer Speicherwarnung die DocRef freigeben und neu laden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X