神秘泄漏是否源于drawRect?

时间:2011-02-19 11:50:14

标签: objective-c xcode ios core-graphics drawrect

这个问题与UIView的-drawRect函数有关。

设置:
我的应用程序包含多页PDF文档,可以通过启用分页的ScrollView进行翻转。每个页面(PDFDisplayView)都是一个自定义的UIView,它使用Core Graphics CGPDF功能来绘制PDF文档的特定页面。 Scroll View尝试通过加载视图中的页面并卸载未使用的页面来优化内存。加载页面会初始化一个UIViewController,它将其视图(PDFDisplayView)添加到ScrollView,后者调用PDFDisplayView的-drawRect函数(如下所示)。

神秘之处:
将视图(PDFDisplayView)添加到其superview(ScrollView)调用-drawRect函数,并在Instruments Object Allocations可视化工具中,内存大小增加。问题是,尽管-drawRect似乎增加了内存使用量,但卸载时从superview(ScrollView)中删除视图似乎并没有减少内存使用量,因为可视化器图形不断上升而不是下降。结果是,当您使用应用程序时,内存使用量会继续扩大,从而导致内存警告并最终崩溃......

其他信息:
我已经检查了我的代码的所有其他方面,以确保我没有在其他地方泄漏内存 - 一切似乎都很好。这让我怀疑drawRect是罪魁祸首。我已经包含了下面的代码。请告诉我你的想法。感谢。

- (void)drawRect:(CGRect)rect {


 CGPDFPageRef thePageRef = [[PDFReaderAppDelegate sharedAppDelegate] getPageRefForPage:self.currentPage];

    if(thePageRef)
    {

        CGContextRef ctx = UIGraphicsGetCurrentContext();

        CGContextSaveGState(ctx);

        CGContextTranslateCTM(ctx, 0.0, [self bounds].size.height);
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextConcatCTM(ctx, 
                           CGPDFPageGetDrawingTransform(thePageRef, kCGPDFCropBox, 
                                                        [self bounds], 0, true));

        CGContextDrawPDFPage(ctx, thePageRef);    
        CGContextRestoreGState(ctx);

        NSLog(@"Drew PDFDisplayView of page %i (-drawRect)", self.currentPage);
    }


}

1 个答案:

答案 0 :(得分:0)

drawRect中的内存malloc将一直存在,直到您释放文档为止。定期发布和重新打开文档是我发现的唯一方法。