Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 仅在某些页面的CGContextDrawPDFPage之后释放上下文时出现异常_Objective C_Cgpdfcontext_Cgcontextdrawpdfpage - Fatal编程技术网

Objective c 仅在某些页面的CGContextDrawPDFPage之后释放上下文时出现异常

Objective c 仅在某些页面的CGContextDrawPDFPage之后释放上下文时出现异常,objective-c,cgpdfcontext,cgcontextdrawpdfpage,Objective C,Cgpdfcontext,Cgcontextdrawpdfpage,我继承了一些iOS代码,它打开一个源PDF,并创建一个CGContextRef,我们从源文档中为其绘制一个页面。问题是,某些页面包含一个文档,不幸的是,我们的帮助文档,这会导致此代码崩溃 最终目标是一次缓存8个页面,以改善用户体验 CFMutableDataRef consumerData = CFDataCreateMutable(kCFAllocatorDefault, 0); CGDataConsumerRef contextConsumer = CGDataConsumerCreateW

我继承了一些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);
(这是代码的简化版本,原始版本会打开一个源文档和一个页面,在
页面
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,是的,我们这样做了,我们最终得到了回复。更新了答案以反映这一点。