Objective c 仅在某些页面的CGContextDrawPDFPage之后释放上下文时出现异常
我继承了一些iOS代码,它打开一个源PDF,并创建一个Objective c 仅在某些页面的CGContextDrawPDFPage之后释放上下文时出现异常,objective-c,cgpdfcontext,cgcontextdrawpdfpage,Objective C,Cgpdfcontext,Cgcontextdrawpdfpage,我继承了一些iOS代码,它打开一个源PDF,并创建一个CGContextRef,我们从源文档中为其绘制一个页面。问题是,某些页面包含一个文档,不幸的是,我们的帮助文档,这会导致此代码崩溃 最终目标是一次缓存8个页面,以改善用户体验 CFMutableDataRef consumerData = CFDataCreateMutable(kCFAllocatorDefault, 0); CGDataConsumerRef contextConsumer = CGDataConsumerCreateW
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);
(这是代码的简化版本,原始版本会打开一个源文档和一个页面,在页面
和ctx
上检查null,然后将ctx
写入新文档。)
如果我不是绘制到PDF上下文,而是绘制到通过以下方式创建的UIGraphics上下文,则没有问题:
CGContextRef graphicsContext=UIGraphicsGetCurrentContext()代码>
当我在PDF上下文中绘制其他内容时也没有问题
另外,这适用于99%的文档和有问题文档中75%的页面。有问题的文档在多个PDF查看器中正确呈现
所以我不认为我有记忆问题。我相当确信CGPDF代码中有一些错误(我只是在花了一周的时间试图解决这个问题后才这么说)
我的问题是,是否有其他方法可以做到这一点?您缺少CGPDFContextBeginPage
有足够的证据表明这是iOS5中引入的一个bug,我们可以解决这个问题,而不是试图解决它。因此,我们最终删除了缓存。与缓存200页文档相比,iPad1上的速度只稍微慢一点,因此产品经理认为这是可以接受的(与简单的崩溃相比)
我们还尝试将文档写入一个图像并显示它,但速度并没有加快,并且产生了质量低劣的结果(尤其是在缩放时)
编辑
将bug提交给苹果。事实证明已经有报道了。最初的bug是10428451,他们的工程师正在检查。谢谢,Rob,但这不是问题所在。我尝试过使用和不使用CGPDFContextBeginPage
以及相应的关闭,但该文档仍然出现异常。您是否向苹果提交了关于此问题的错误报告?有答复吗?我们也遇到了这个问题,无法真正解决它,因为我们需要发送带有注释的PDF文档(即从原始文档中绘制PDF页面,在顶部绘制内容,通过电子邮件发送为PDF文档)。@PhilippeSabourin,是的,我们这样做了,我们最终得到了回复。更新了答案以反映这一点。