我正在实现一个pdf阅读器。我编写代码的方式对于许多pdf而言已经足够了。一个单独的pdf进入了300MB(总共1000页)的图片。这个pdf工作正常,最多70页以后它会杀了我的应用程序我正在检查设备(IPad1,V5.0)和模拟器(V 5.0)。在模拟器中,我可以导航所有页面从1开始到最后一页,但来到设备我不能这样做。我看到内存分配在“工具”
中在显示内存分配和内存利用率波动的图像矩形框中,对于每个新呈现的单页(打开应用程序后第一次)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释放和保留方法但没有用。你的建议对我更有用。谢谢提前。
答案 0 :(得分:1)
基本上,你的应用程序使用太多内存并被操作系统杀死。模拟器有足够的内存,但iPad没有。这就是设备和模拟器之间存在行为差异的原因。
使用大量内存的原因是Quartz 2D的bug /功能。绘制页面时,页面使用的所有对象都将读入内存并进行解压缩。并且这些解压缩的对象由Quartz 2D缓存(明智的决定)。问题是:在关闭PDF之前,不会从缓存中删除这些对象。
所以,显而易见的方法是:
我使用这种方法,即使对于包含大量图像(杂志)的大型PDF也能正常工作。
有关详细信息,您可能需要查看Fast and Lean PDF Viewer for iPhone / iPad / iOs - tips and hints?讨论。