CGPDF Проблемы с памятью iPhone / iPad - PullRequest
2 голосов
/ 12 октября 2010

Я боролся целую вечность, пытаясь сделать работающее устройство для чтения PDF для iPhone / iPad, но эта штука просто не перестает есть память. Кажется, что все страницы, нарисованные с помощью CGContextDrawPDFPage, кэшируются внутри и никогда не освобождаются.

Я не единственный с этой проблемой: http://lists.apple.com/archives/quartz-dev/2010/Apr/msg00025.html

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

Один ответ из первой темы:

Если это то, что я думаю, то это не утечка, а кеш. Вместо того чтобы сохранять документ PDF между вызовами, попробуйте создать документ, получить и нарисовать страницу, а затем выпустить документ после завершения.

Я пробовал это, и это решает проблему, но это слишком чертовски медленно. Принимая во внимание, что выполнение этого «обычным» способом (то есть без загрузки / выпуска CGPDFDocument для каждой прорисовки) работает хорошо и достаточно быстро, пока я не доберусь до 4-й или 5-й страницы документа и не произойдет сбой.

Я гуглял эту проблему целую вечность: у всех одна и та же проблема, но, видимо, никто не заставил ее работать. Единственные образцы, которые я нашел, загружают одностраничный PDF, так что, очевидно, все работает нормально, пока вы не загрузите документ с несколькими страницами (и, конечно, если в нем есть изображения, он падает еще раньше). Это сводит меня с ума.

Итак, вопрос в том, как именно вы обрабатываете рисование PDF с помощью CGPDF в своем приложении? Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

5 голосов
/ 13 октября 2010

Мой текущий корпоративный проект основан на программе чтения PDF.Я не выпускаю CGPDFDocument, и я могу пролистать 14-страничный яблочный PDF-файл с максимальным объемом приложения 30 МБ.Я не могу дать вам код, но могу указать правильное направление.

Я начал похожую тему здесь: Быстрый и Lean PDF Viewer для iPhone / iPad / iOs - советы и подсказки?

Несколько советов:

- Сохраняйте любые носители на диск, когда можете.

-Использование больших плиток Размеры при рендеринге на TiledLayers

-Обратите внимание, что изображения будут рендериться быстрее, чем CGPDFPageRef

-Используйте NSOperation для подготовки страниц вперед
времени.

-Перерабатывать объекты страницы

-Закрывать любые открытые контексты, как только они вам не нужны

-при получении предупреждения о выпуске памяти и перезагрузить DocRef

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...