2010-10-04 30 views
0

我讀PDF文件,然後將其釋放:iOS的核芯顯卡PDF內存管理問題

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

但內存沒有釋放後釋放(檢查與儀器)。爲什麼?內存管理中缺少的東西。

謝謝。

編輯

這裏是我的代碼:

- (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示例中查看。它使用CATiledLayer繪製CGPDFPageRef

我調用tests方法後,視圖被刪除(變爲不可見),但分配了CGPDFDocumentCreateWithURL的內存未被釋放。

+0

'CGPDFDocumentGetNumberOfPages'返回'size_t',而不是'int'。 'size_t'是無符號的,而'int'是有符號的,'size_t'可能比int更大(以字節爲單位,因此在範圍內)。當心那些看似負面(實際上只是非常大)頁面數量的大文檔,或者有效的隨機頁數(當size_t大於int時,並且你的數字太大以至於超出了範圍'int',所以部分數字會被刪除)。你應該總是使用正確的類型來處理你正在使用的值。 – 2010-10-05 03:04:21

+0

謝謝彼得,我會解決它的。 – negersiu 2010-10-05 07:23:03

回答

2

什麼內存沒有發佈?正如你所說,你恰當地發佈了CGPDFDocument,所以應該消失。

你確定它不是CFURL嗎?你不顯示自己釋放,但你複製它,所以你有義務。見the Memory Management Guide for Core Foundation

您可以使用ObjectAlloc工具來確定哪些特定的對象仍處於活動狀態。將時間線中的開始點和結束點分別設置爲創建對象之前和釋放對象之後,然後將樂器設置爲向您顯示「已創建對象仍然生活的對象」&。您還可以使用Leaks工具向您顯示哪些對象仍然存在,您不再有指向。這兩種工具最初都按類別顯示細分,您可以深入查看實例,然後查看事件(分配,保留,自動釋放,釋放和釋放)。

+0

用CGPDFDocumentCreateWithURL分配的內存沒有被釋放(〜3MB被分配並仍然使用)。我編輯了我的代碼 – negersiu 2010-10-05 12:58:45

+0

您不應該將'self.view'屬性設置爲'nil',而不是釋放您仍然保留的視圖?另外,你是否已經確認該頁面(我認爲該視圖保留)已經發布? – 2010-10-05 22:27:51