CGContextDrawPDFPage在OS X 10.8上随机地与EXC_BAD_ACCESS崩溃

时间:2013-10-22 17:06:55

标签: pdf core-graphics osx-mountain-lion exc-bad-access

我的应用程序采用PDF并为给定数量的页面生成缩略图。

OS X 10.7上的一切都很好

在OS X 10.8上,在某些页面上,在某些PDF上(在1400测试中,计数是7个文档,只有一个“冒犯”页面),在调用 CGContextDrawPDFPage 时无法呈现EXC_BAD_ACCESS

有时(1比10)它成功了。但是,该文件页面的90%会导致崩溃。

下面发布的相关代码会针对每个 pageNumber 循环重复,以提供所提供的 pdfDocument 。每次迭代都会产生一个 CGImageRef imgRef,它将保存到一个数组中并在以后使用。


假设第30页发生了崩溃。

如果我从28到38渲染是可以的。

如果我从27到37渲染崩溃。

如果我渲染只有30就一直没问题。

包含违规的一些页面崩溃。其他没有。


这似乎是PDFKit 10.8中的一个错误...(当被要求渲染同一文档的多个页面时,尝试进行一些内部缓存优化时搞砸了什么?)

当然,我不能排除代码中的错误,但似乎不太可能。

任何关于如何解决这个问题的想法都将受到赞赏。

    CGPDFPageRef     pdfPage      =   CGPDFDocumentGetPage 
                                            ( pdfDocument,
                                              pageNumber );

    if( !pdfPage ) return;

    CGPDFPageRetain(pdfPage);

    CGRect          rect          =   CGPDFPageGetBoxRect
                                            ( pdfPage,
                                              kCGPDFCropBox);

    CGColorSpaceRef imgColorSpace =   CGColorSpaceCreateDeviceRGB ( );

    CGContextRef    contextRef    =   CGBitmapContextCreate
                                            ( NULL,
                                              (size_t) (rect.size.width),
                                              (size_t) (rect.size.height),
                                              8,
                                              ((size_t) (rect.size.width))*4,
                                              imgColorSpace,
                                              kCGImageAlphaPremultipliedLast );

    CGColorSpaceRelease ( imgColorSpace );
    if( !contextRef ) return;

    CGContextDrawPDFPage ( contextRef, pdfPage ); // <==== EXC_BAD_ACCESS

    CGImageRef      imgRef        =   CGBitmapContextCreateImage
                                            ( contextRef );

    CFRelease ( contextRef );

    CGPDFPageRelease( pdfPage );

1 个答案:

答案 0 :(得分:0)

这是OS X 10.8中引入的PDFKit的错误

该错误已在OS X 10.9中修复