Ответ 1
Вы строите PDF в основном потоке? Если это так, вы можете не получить предупреждение о памяти, потому что вы заблокировали сигнал во время выполнения, так как цикл выполнения никогда не имеет возможности отправить вам сообщение.
Я пытаюсь сделать страницу PDF с некоторыми аннотациями на ней (по электронной почте), и большую часть времени это отлично работает.
Однако, с этим PDF, в частности, он каждый раз вызывает сбой при вызове CGContextDrawPDFPage для первой страницы. Я добавил
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);
как рекомендация CGContextDrawPDFPage, занимающая большие объемы памяти, но это, похоже, не решило мою проблему.
Я пропустил это через профилировщик, чтобы узнать, что происходит, и он медленно начал выделять кучу памяти, пока, наконец, не ударил 512 Мбайт живых байтов и не умер.
Странно то, что когда я визуализую это на изображении (для отображения на устройстве), он работает нормально, но когда я переводил его в контекст 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
Вы строите PDF в основном потоке? Если это так, вы можете не получить предупреждение о памяти, потому что вы заблокировали сигнал во время выполнения, так как цикл выполнения никогда не имеет возможности отправить вам сообщение.
Удалите контрольную точку исключения в xcode, и она отлично работает.