5

CGContextRefソース PDF を開き、ソース ドキュメントから 1 ページを描画する を作成する iOS コードをいくつか継承しました。問題は、1 つのドキュメント (残念ながらヘルプ ドキュメント) を含む特定のページがあり、このコードがクラッシュすることです。

最終的な目標は、一度に 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);

(これはコードの簡略化されたバージョンです。元のコードはソース ドキュメントとページを開き、 と で null をチェックしpageてから、新しいドキュメントctxに書き込みます。)ctx

PDF コンテキストに描画する代わりに、このように作成された UIGraphics コンテキストに描画しても問題はありません。

CGContextRef graphicsContext = UIGraphicsGetCurrentContext();

PDFコンテキストに他のものを描画しても問題はありません。

さらに、これはドキュメントの 99% と問題のあるドキュメント内のページの 75% で機能します。問題のあるドキュメントは、いくつかの PDF ビューアで正しく表示されます。

したがって、私の側にメモリの問題があるとは思いません。私は、CGPDF コード内にバグのあるものがあることをかなり確信しています (そして、この問題を解決するために 1 週​​間を費やした後でのみそう言います)。

私の質問は、これを行うべき/行うことができる他の方法はありますか?

4

2 に答える 2

1

There is enough evidence that this is a bug introduced in iOS5 for us to work around the issue rather than trying to solve it. So we ended up removing the caching. It's only marginally slower on an iPad 1 than it was with caching for a 200 page document, so the product manager decided that was acceptable (when compared to simply crashing).

We also tried writing the doc to an image and displaying that, but it wasn't any faster and produced a result of inferior quality (especially when zooming).

EDIT

Submitted the bug to Apple. It turns out to have already been reported. The original bug is 10428451 and is being looked at by their engineers.

于 2011-11-28T14:13:34.480 に答える
0

あなたは行方不明CGPDFContextBeginPageです。

于 2011-11-22T00:26:58.303 に答える