高分辨率pdf导致页面之间导航时崩溃

时间:2012-02-08 17:27:19

标签: ipad pdf ios5 quartz-2d

我正在实现一个pdf阅读器。我编写代码的方式对于许多pdf而言已经足够了。一个单独的pdf进入了300MB(总共1000页)的图片。这个pdf工作正常,最多70页以后它会杀了我的应用程序我正在检查设备(IPad1,V5.0)和模拟器(V 5.0)。在模拟器中,我可以导航所有页面从1开始到最后一页,但来到设备我不能这样做。我看到内存分配在“工具” Image

在显示内存分配和内存利用率波动的图像矩形框中,对于每个新呈现的单页(打开应用程序后第一次)CGContextDrawPDFPage方法增加2MB内存。我不知道为什么CGContextDrawPDFPage大幅增加。我看过关于此的许多博客,但没有使用和浪费时间。下面是我的示例代码

otherPageRef = CGPDFDocumentGetPage(myDocumentRef, c);

            cropBox = CGPDFPageGetBoxRect(otherPageRef, kCGPDFCropBox);
            CGContextSaveGState(ctx);
            CGContextSetRGBFillColor(ctx, 1.0, 1.0, 1.0, 1.0);
            CGContextFillRect(ctx,CGContextGetClipBoundingBox(ctx));
            CGFloat aspectRatio=aspectFitSize.width/aspectFitSize.height;
            CGRect targetRect = layer.bounds;
            CGFloat xScale = targetRect.size.width / cropBox.size.width;
            CGFloat yScale = (targetRect.size.height-__TOP_BRANDING_BAR_HEIGHT) / cropBox.size.height;
            CGFloat scaleToApply = (xScale < yScale) ? xScale : yScale;
            CGContextTranslateCTM(ctx, -cropBox.origin.x, layer.bounds.size.height- __TOP_BRANDING_BAR_HEIGHT +cropBox.origin.y);
            CGContextScaleCTM(ctx, 1.0, -1.0);
            CGContextConcatCTM(ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply));
            if (scaleToApply == yScale){
                CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation((layer.bounds.size.width-(cropBox.size.width*scaleToApply)-cropBox.origin.x)/(scaleToApply * 2.0), 0));
            }
            else{
                if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
                    CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation(0, (layer.bounds.size.height- __TOP_BRANDING_BAR_HEIGHT -(cropBox.size.height*scaleToApply))/(scaleToApply*2.0)));
                }
                else {
                    CGContextConcatCTM(ctx, CGAffineTransformMakeTranslation(0, (layer.bounds.size.height- __TOP_BRANDING_BAR_HEIGHT -(cropBox.size.height*scaleToApply))/(scaleToApply*2.0)));
                }
            }


            CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh); 
            CGContextSetRenderingIntent(ctx, kCGRenderingIntentDefault);
            CGContextDrawPDFPage(ctx, otherPageRef);
            CGContextRestoreGState(ctx);

任何人都可以猜到我的应用程序崩溃的原因是什么,请建议我处理技术。我甚至尝试了我的cgpdfdocumentRef释放和保留方法但没有用。你的建议对我更有用。谢谢提前。

1 个答案:

答案 0 :(得分:1)

基本上,你的应用程序使用太多内存并被操作系统杀死。模拟器有足够的内存,但iPad没有。这就是设备和模拟器之间存在行为差异的原因。

使用大量内存的原因是Quartz 2D的bug /功能。绘制页面时,页面使用的所有对象都将读入内存并进行解压缩。并且这些解压缩的对象由Quartz 2D缓存(明智的决定)。问题是:在关闭PDF之前,不会从缓存中删除这些对象。

所以,显而易见的方法是:

  1. 打开PDF
  2. 画1-5页
  3. 关闭PDF
  4. 如果需要,重复
  5. 我使用这种方法,即使对于包含大量图像(杂志)的大型PDF也能正常工作。

    有关详细信息,您可能需要查看Fast and Lean PDF Viewer for iPhone / iPad / iOs - tips and hints?讨论。