iOS Core Graphics PDF内存管理问题

时间:2010-10-04 11:33:01

标签: objective-c memory-management core-graphics

我正在阅读PDF文件,然后将其发布:

CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)@"somepdf.pdf", NULL, NULL);
CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL);    
int pagesCount = CGPDFDocumentGetNumberOfPages(pdf);
CGPDFDocumentRelease(pdf);

但是释放后内存没有被释放(用Instruments检查)。为什么?我在记忆管理方面缺少什么。

感谢。

修改

这是我的代码:

- (void)loadView {
            [super loadView];
            CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), (CFStringRef)@"some.pdf", NULL, NULL);
            pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); 
            CFRelease(pdfURL);
            CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdf, 1);

            TiledPDFView * v = [[TiledPDFView alloc] initWithFrame:self.view.bounds andScale:1];
            [v setPage:pdfPage];

            [self.view addSubview:v];


            UIButton * but = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            [but setTitle:@"removeView" forState:UIControlStateNormal];
            [but addTarget:self action:@selector(tests) forControlEvents:UIControlEventTouchDown];
            but.frame = CGRectMake(0, 0, 100, 40);
            [self.view addSubview:but];

    }

    -(void) tests {
        [self.view removeFromSuperview];
        [self.view release];
        CGPDFDocumentRelease(pdf);
    }

pdf是实例变量。 TiledPDFView - 是来自ZoomingPDFViewer示例的uiview。它使用CGPDFPageRef绘制CATiledLayer

在我调用tests方法后,视图被删除(变得不可见),但是没有释放分配有CGPDFDocumentCreateWithURL的内存。

1 个答案:

答案 0 :(得分:2)

什么内存没有发布?如你所说,你正式发布了CGPDFDocument,所以它应该已经消失了。

你确定这不是CFURL吗?你没有表现出自己的释放,但你复制了它,所以你有义务。请参阅the Memory Management Guide for Core Foundation

您可以使用ObjectAlloc工具确定哪些特定对象保持活动状态。将时间轴中的起点和终点分别设置为创建对象之前和释放之后,然后将仪器设置为显示“Objects Created& amp;还活着”。您还可以使用“泄漏”工具向您显示您不再拥有指针的物体。这两种工具最初都按类分类显示,您可以深入查看实例,然后查看事件(分配,保留,自动释放,发布和解除分配)。