2010-06-21 76 views
2

我遇到了使用Quartz PDF API for iOS崩潰的問題。目前我正在使用SDK 4.0 GM Seed進行編譯,並在我的3.2 iPad上運行(我嘗試使用3.2 SDK獲得相同的結果)。石英PDF API導致內存不足崩潰

我使用的所有代碼都基於標準的Apple Quartz文檔以及來自各種互聯網的資源。所以我無法想象我正在做一些完全不同或錯誤的事情。

代碼在模擬器(所有版本,它是一個通用應用程序),甚至在使用「模擬內存警告」功能時都能夠完美運行。我使用了泄漏工具,沒有發現泄漏。建立和分析也沒有發現。我的庫中沒有發生崩潰或內存不足日誌。

這一切都讓我相信設備內存不足。發生這種情況後,通過說50頁的pdf頁面,約35%有一些圖像(一些完整的頁面一些圖標)。它不會在任何特定頁面上崩潰。我正在加載的pdf大約有75頁和3.5MB。

我已經仔細閱讀了本網站和互聯網上的類似問題,並在下面的代碼中應用了一些建議。我現在每轉一頁就發佈pdf文檔參考,而我不再保留/發佈頁面參考。我還簡化了從使用CGImages到僅使用UIGraphicsGetImageFromCurrentImageContext函數的圖像交換。我已經嘗試過用於切換圖像的各種實現,包括用新分配的臨時實例(使用[[UIImageView alloc] iniWithImage:UIGraphicsGetImageFromCurrentImageContext()])完全替換pdfImgView,使用pdfImgView的setter和釋放te​​mp。所有這些變化都通過了泄漏和分析儀測試,但仍然表現出相同的崩潰行爲。

因此,在我完全不用PDF格式之前,有什麼我應該嘗試的或者我失蹤的東西?

,被稱作接口處理器交換頁和第一次加載視圖控制器代碼:用於配置和借鑑PDF頁面上下文

[self drawPage]; 

// ...animation code...simple CATransition animation...crashes with or without 

// scrollView is a UIScrollView that is a subview of self.view 
[scrollView.layer addAnimation:transition forKey:nil]; 
// pdfImgView is a UIImageView that is a subview of scrollView 
pdfImgView.image = UIGraphicsGetImageFromCurrentImageContext(); 

一個DrawPage方法:

[CFURLRef pdfURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), CFSTR("BME_interior.pdf"), NULL, NULL); 
pdfRef = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); // instance variable, not a property 
CFRelease(pdfURL); 
CGPDFPageRef page = CGPDFDocumentGetPage(pdfRef, currentPage); 

CGRect box = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); 
// ...setting scale and imageHeight, both floats... 

if (UIGraphicsBeginImageContextWithOptions != NULL) { 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.frame.size.width, imageHeight), NO, 0.0); 
} else { 
    UIGraphicsBeginImageContext(CGSizeMake(self.view.frame.size.width, imageHeight)); 
} 
CGContextRef context = UIGraphicsGetCurrentContext(); 
NSLog(@"page is %d, context is %d, pdf doc is %d, pdf page is %d", currentPage, context, pdfRef, page); // all prints properly 

// ...setting up scrollView for new page, using same instance... 

CGContextTranslateCTM(context, (self.view.frame.size.width-(box.size.width*scale))/2.0f, imageHeight); 
CGContextScaleCTM(context, scale, -1.0*scale); 

CGContextSaveGState(context); 
CGContextDrawPDFPage(context, page); 
CGContextRestoreGState(context); 

CGPDFDocumentRelease(pdfRef); 
pdfRef = NULL; 
+0

您可以使用儀器,看看哪些對象是吃所有的可用內存。 (儀器不僅可以檢查泄漏,還可以檢查活物。)它們是什麼?答案將取決於此。 – Yuji 2010-06-21 22:57:58

+0

我的實時分配永遠不會超過〜12MB,然後突然上升然後下降,通常在閒置時平均3-5MB左右。使用內存監視器儀器告訴我,我的應用程序的虛擬內存在崩潰之前超過了200MB。 我看到內存警告1級然後2級,然後幾頁後它會崩潰。因此,應該釋放由UIImage或UIImageView緩存的圖像(如果有的話),但顯然還是有些東西懸而未決。 – bensnider 2010-06-22 13:16:42

回答

1

啊哈!我已經通過在開始新的圖像上下文之前添加UIGraphicsEndImageContext();來解決崩潰問題。我甚至不得到內存警告現在......