Исключение освобождает контекст после CGContextDrawPDFPage только для некоторых страниц

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

Конечная цель - кэшировать 8 страниц за раз, чтобы улучшить взаимодействие с пользователем.

CFMutableDataRef consumerData = CFDataCreateMutable(kCFAllocatorDefault, 0);
CGDataConsumerRef contextConsumer = CGDataConsumerCreateWithCFData(consumerData);

CGPDFPageRef page = CGPDFDocumentGetPage(sourceDocument, pageNumber);

const CGRect mediaBox = CGPDFPageGetBoxRect(page, kCGPDFCropBox);
CGContextRef pdfOutContext = CGPDFContextCreate(contextConsumer, &mediaBox, NULL);

CGContextDrawPDFPage(pdfOutContext, page); //If I comment out this line, no exception occurs

CGPDFPageRelease(page);
CGPDFContextEndPage(pdfOutContext);

CGPDFContextClose(pdfOutContext); //EXC_BAD_ACCESS
CGContextRelease(pdfOutContext);

(Это упрощенная версия кода, оригинал открывает исходный документ и страницу, проверяет наличие нуля на page а также ctx, а затем пишет ctx в новый документ.)

Нет проблем, если вместо рисования в контексте PDF я рисую в контексте UIGraphics, созданном таким образом:

CGContextRef graphicsContext = UIGraphicsGetCurrentContext();

Также нет проблем, когда я рисую другие вещи в контексте PDF.

Кроме того, это работает для 99% документов и для 75% страниц в нарушающем документе. Оскорбительный документ отображается правильно в нескольких программах просмотра PDF.

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

У меня вопрос, есть ли другой способ, которым я должен / мог бы делать это?

2 ответа

Решение

Существует достаточно доказательств того, что это ошибка, введенная в iOS5, чтобы мы могли обойти проблему, а не пытаться ее решить. Таким образом, мы закончили тем, что удалили кэширование. На iPad 1 он работает лишь незначительно медленнее, чем при кэшировании 200-страничного документа, поэтому менеджер по продукту решил, что это приемлемо (по сравнению с простым сбоем).

Мы также попытались записать документ на изображение и отобразить его, но это не было быстрее и привело к ухудшению качества (особенно при масштабировании).

РЕДАКТИРОВАТЬ

Отправил ошибку в Apple. Оказывается, уже сообщалось. Первоначальная ошибка 10428451, на которую смотрят их инженеры.

Ты пропускаешь CGPDFContextBeginPage,

Другие вопросы по тегам