用于查看iOS 6.1的PDF页面的内存问题

时间:2013-06-20 09:05:48

标签: ios objective-c ios6

我在一个应该显示(大)PDF的简单iPad / iPhone应用程序上遇到了一些内存问题。这就是我的工作。

我有一个包含5个子视图的scrollView。每个子视图都显示我的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页面的方法,如果不再需要旧页面。

- (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页面的记忆......

1 个答案:

答案 0 :(得分:1)

使用ARC,您仍需要付出一些努力来管理Foundation对象。您可以使用CGPDFPageRelease发布旧页面。或者,您可以在pdfPage属性声明中添加适当的属性,如this answer

中所述