我继承了一些 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);
(这是代码的简化版,原文打开一个源文档和一个页面,检查 and 是否为空page
,ctx
然后写入ctx
一个新文档。)
如果我不是绘制到 PDF 上下文,而是绘制到由此创建的 UIGraphics 上下文,则没有问题:
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
当我在 PDF 上下文中绘制其他内容时也没有问题。
此外,这适用于 99% 的文档和违规文档中 75% 的页面。有问题的文档可以在多个 PDF 查看器中正确呈现。
所以我不认为我的内存有问题。我相当有信心在 CGPDF 代码中有些东西是错误的(我说只有在花了一周时间试图解决这个问题之后)。
我的问题是,我应该/可以这样做吗?