Сбой CGContextDrawPDFPage без предупреждения памяти - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь отобразить страницу PDF с некоторыми аннотациями (по электронной почте), и большую часть времени это работает нормально.

Однако, с этим PDF , в частности, он, кажется, падает каждый раз при вызове CGContextDrawPDFPage для первой страницы. Я добавил

CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);

как рекомендация от CGContextDrawPDFPage, занимающего большие объемы памяти , но это, похоже, не решило мою проблему.

Я пропустил это через профилировщик, чтобы посмотреть, что происходит, и он медленно начал выделять кучу памяти, пока, наконец, не достиг 512 МБ живых байтов и не умер. memory allocation profiled in instrument

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

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

Еще один ресурс, на который я посмотрел, был этот замечательный ТАК вопрос.

Редактировать (подробнее о сбое):

В 90% случаев сбой фактически не отображается, отображается строка GDB, но приложение исчезает, а трассировка стека не отображается. (Он говорит, что приостановлен, но нет отображения потока). Однажды я увидел, что это был exc_bad_access, и он показал это в журнале:

malloc: *** mmap(size=16777216) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

Ответы [ 2 ]

1 голос
/ 01 марта 2012

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

0 голосов
/ 05 января 2016

Удалите точку останова исключения в xcode, и она отлично работает.

...