私のアプリケーションは PDF を受け取り、指定されたページ数のサムネイルを生成します。
OS X 10.7ではすべて問題ありません
OS X 10.8 では、一部のページ、一部の PDF (1400 のテストでは、カウントは 1 つの「問題のある」ページを含む 7 つのドキュメント) でレンダリングに失敗し、CGContextDrawPDFPage を呼び出すとEXC_BAD_ACCESSが発生します。
時々 (10 分の 1) 成功します。しかし、90% の確率で、そのドキュメントのそのページがクラッシュを引き起こします。
以下に掲載されている関連コードは、提供された pdfDocument からレンダリングされる各 pageNumber に対してループで繰り返されます。各反復は、配列に保存され、後で使用される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 );