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 週間を費やした後でのみそう言います)。
私の質問は、これを行うべき/行うことができる他の方法はありますか?