Rob*_*and 5 objective-c cgpdfcontext cgcontextdrawpdfpage
我继承了一些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);
Run Code Online (Sandbox Code Playgroud)
(这是代码的简化版本,原来打开一个源文件和一个网页,检查对空page和ctx,然后写入ctx到一个新的文件.)
如果不是绘制到PDF上下文,而是绘制到如此创建的UIGraphics上下文,那就没有问题了:
CGContextRef graphicsContext = UIGraphicsGetCurrentContext();
当我在PDF上下文中绘制其他内容时也没有问题.
此外,这适用于99%的文档和违规文档中75%的页面.违规文档在多个PDF查看器中正确呈现.
所以我认为我不会有内存问题.我相信CGPDF代码中有一些东西是错误的(我说只有花了一个星期才试图解决这个问题).
我的问题是,还有其他方式我应该/可以这样做吗?
有足够的证据表明这是 iOS5 中引入的错误,我们可以解决这个问题而不是试图解决它。所以我们最终删除了缓存。它在 iPad 1 上仅比缓存 200 页文档慢一点,因此产品经理认为这是可以接受的(与简单的崩溃相比)。
我们还尝试将文档写入图像并显示该图像,但它并没有更快,并且产生的结果质量较差(尤其是在缩放时)。
编辑
已将该错误提交给 Apple。原来已经被举报了。最初的错误是10428451,他们的工程师正在研究该错误。
| 归档时间: |
|
| 查看次数: |
1582 次 |
| 最近记录: |