Исключение, освобождающее контекст после CGContextDrawPDFPage только для некоторых страниц - PullRequest
5 голосов
/ 21 ноября 2011

Я унаследовал некоторый код 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 ]

1 голос
/ 28 ноября 2011

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

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

EDIT

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

0 голосов
/ 22 ноября 2011

Тебе не хватает CGPDFContextBeginPage.

...