我在一个应该显示(大)PDF 的简单 iPad/iPhone 应用程序上遇到了一些内存问题。这就是我所做的。
我有一个带有 5 个子视图的滚动视图。每个子视图显示我的 PDF 的一页。始终显示一页,每侧预加载 2 页。如果您滚动,将获取一个不再需要的视图,呈现要预加载的新 PDF 页面,并将视图重新定位在 scrollView 内。
除了内存问题,一切都很好。如果我分析内存泄漏,活动字节将从 4MB 增长到 40MB+。总字节数增加到 600 MB+。我认为实时字节不应该真正增长,因为我在任何时候都有相同的 5 个视图。还是我读取的值不正确?
使用 ARC。
这是呈现 PDF 页面的代码。
-(void)drawRect:(CGRect)inRect{
self.ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(self.ctx);
CGRect cropBox = CGPDFPageGetBoxRect(self.pdfPage, kCGPDFCropBox);
CGRect targetRect = [self bounds];
CGFloat xScale = targetRect.size.width / cropBox.size.width;
CGFloat yScale = targetRect.size.height / cropBox.size.height;
CGFloat scaleToApply = xScale < yScale ? xScale : yScale;
CGFloat newWidth = cropBox.size.width * scaleToApply;
CGFloat newHeight = cropBox.size.height * scaleToApply;
CGFloat xOffset = (targetRect.size.width - newWidth) / 2;
CGFloat yOffset = (targetRect.size.height - newHeight) / 2;
CGContextTranslateCTM(self.ctx, xOffset, [self bounds].size.height - yOffset);
CGContextScaleCTM(self.ctx, 1.0, -1.0);
CGContextConcatCTM(self.ctx, CGAffineTransformMakeScale(scaleToApply, scaleToApply));
CGContextSetInterpolationQuality(self.ctx, kCGInterpolationHigh);
CGContextSetRenderingIntent(self.ctx, kCGRenderingIntentDefault);
CGContextDrawPDFPage(self.ctx, self.pdfPage);
CGContextRestoreGState(self.ctx);
}
如果不再需要旧的 PDF 页面,这就是使视图重新呈现到新 PDF 页面的方法。
- (void)redrawPdfPage:(CGPDFPageRef)pPdfPage withPageNum:(int)pPageNum {
self.pdfPage = pPdfPage;
self.pageNum = pPageNum;
CGRect r = [self frame];
r.origin.x = r.size.width * (self.pageNum - 1);
[self setFrame:r];
[self setNeedsDisplay];
}
对此的任何建议将不胜感激,因为我正试图弄清楚如何释放旧 PDF 页面的内存几天......