2013-07-17 75 views
0

我有以下方法在文檔目錄中生成一個pdf文件並創建一個縮略圖。如註釋中所示,此方法在兩處泄漏內存。由於我使用ARC,我不確定它爲什麼會泄漏內存。我該如何解決這個問題。創建UIImage時的內存泄漏

+ (UIImage*)createPdfThumbnail:(NSString*)pdfFilePath { 


     NSURL *targetURL = [NSURL fileURLWithPath:pdfFilePath]; 
     CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((__bridge CFURLRef)targetURL); // 3.0% of memory leak 

     CGPDFPageRef page = CGPDFDocumentGetPage(pdf, 1);//for the first page 
     CGRect aRect = CGPDFPageGetBoxRect(page, kCGPDFCropBox); 
     UIGraphicsBeginImageContext(aRect.size); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     CGContextSaveGState(context); 
     CGContextTranslateCTM(context, 0.0, aRect.size.height); 
     CGContextScaleCTM(context, 1.0, -1.0); 
     CGContextTranslateCTM(context, -(aRect.origin.x), -(aRect.origin.y)); 

     CGContextSetGrayFillColor(context, 1.0, 1.0); 
     CGContextFillRect(context, aRect); 

     CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(page, kCGPDFCropBox, aRect, 0, false); 
     CGContextConcatCTM(context, pdfTransform); 
     CGContextDrawPDFPage(context, page); 

     UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext(); // 97% of memory leak 
     CGContextRestoreGState(context); 
     UIGraphicsEndImageContext(); 
     CGPDFDocumentRelease(pdf); 
     return thumbnail; 

} 

編輯

-(void)fromJSON:(NSDictionary *)JSON{ 
    [super fromJSON:JSON]; 
    self.path = JSON[@"path"]; 
    //Create and save thumbnail 
    if (self.parentSpecSheet != nil){ 
     @autoreleasepool { 
      UIImage* thumbnail = [Utilities createPdfThumbnail:self.path]; 
      Photo* thumbnailPhoto = [Photo addObject]; 
      [thumbnailPhoto setDelta:@(0)]; 
      [thumbnailPhoto setImage:thumbnail]; 
      [thumbnailPhoto.file setDelta:@(0)]; 
      self.parentSpecSheet.thumbnail = thumbnailPhoto; 
     } 
    } 
} 
+1

http://stackoverflow.com/questions/5121120/uigraphicsgetimagefromcurrentimagecontext-memory-leak-pdf-previews的複製 – Anand

+0

你可以在上面的鏈接 – Anand

+0

@Anand要你指哪個答案的答案? – Rob

回答

0

兩個想法:

  1. 我體驗從CGContextDrawPDFPage一個顯著泄漏,當我在iOS5的測試代碼(如果你搜索"CGContextDrawPDFPage leak",你會看到噸的這個問題的排列引用)。這似乎是一個已知的問題。

    儘管如此,我沒有看到上述代碼在iOS 6中有明顯的泄漏。

  2. 如果你仍然在iOS 6中看到這個泄漏,那麼我懷疑問題不在於上述代碼。你有沒有其他泄漏報告?我還建議您確認擁有此thumbnail的對象是否已成功自行釋放(例如,其dealloc方法中的日誌/斷點)。

    不幸的是,當您查看泄漏工具時,它會報告泄漏對象的實例化位置,而不是泄漏發生的位置。您可能想要確認此thumbnail的所有者不是在某種程度上保持強烈的引用(例如,所有者本身具有保留週期等)。

+0

嗨,羅布,感謝您的幫助,我在iOS 5.1中運行此,我已經添加了調用此方法的代碼。我在後臺線程中運行這兩個函數 – ila

+0

@ila我認爲這是一個iOS 5的bug,因爲在iOS 6中已修復。請參閱http://stackoverflow.com/questions/14141423/cgcontextdrawpdfpage-leaking-in-ios-6一些潛在的解決方法可能適用於iOS 5(儘管我無法證實它們)。對於我來說,問題是考慮到iOS 6的高轉換率,我會投入多少努力才能投入iOS 5的bug(我可能傾向於仍然支持iOS 5目標,但可能會投入運行時版本的iOS版本檢查,但不會生成運行iOS 6.0之前版本設備的自定義縮略圖)。只需要花多少時間投資舊iOS版本的bug。 – Rob

+0

即使在i0S 6中也會泄漏內存。 – ila