Подтвердить что ты не робот

Сбой CGContextDrawPDFPage без предупреждения о сохранении памяти

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

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

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

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

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

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

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

Другим ресурсом, на который я смотрел, был этот замечательный SO-вопрос.

Изменить (дополнительная информация о сбое):

В 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
4b9b3361

Ответ 1

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

Ответ 2

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