5

我继承了一些 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 是否为空pagectx然后写入ctx一个新文档。)

如果我不是绘制到 PDF 上下文,而是绘制到由此创建的 UIGraphics 上下文,则没有问题:

CGContextRef graphicsContext = UIGraphicsGetCurrentContext();

当我在 PDF 上下文中绘制其他内容时也没有问题。

此外,这适用于 99% 的文档和违规文档中 75% 的页面。有问题的文档可以在多个 PDF 查看器中正确呈现。

所以我不认为我的内存有问题。我相当有信心在 CGPDF 代码中有些东西是错误的(我说只有在花了一周时间试图解决这个问题之后)。

我的问题是,我应该/可以这样做吗?

4

2 回答 2

1

有足够的证据表明这是 iOS5 中引入的一个错误,我们可以解决这个问题而不是试图解决它。所以我们最终删除了缓存。它在 iPad 1 上只比缓存 200 页文档慢一点,所以产品经理认为这是可以接受的(与简单的崩溃相比)。

我们还尝试将文档写入图像并显示它,但它并没有更快并且产生了质量较差的结果(尤其是在缩放时)。

编辑

将错误提交给 Apple。原来已经被举报了。最初的错误是10428451,他们的工程师正在研究。

于 2011-11-28T14:13:34.480 回答
0

你不见了CGPDFContextBeginPage

于 2011-11-22T00:26:58.303 回答