2012-02-29 96 views
1

我想呈現一個PDF頁面上有一些註釋(電子郵件),並且大多數時候這工作正常。CGContextDrawPDFPage崩潰沒有產生內存警告

但是,特別是這個PDF似乎每次都在第一頁調用CGContextDrawPDFPage時崩潰。我已添加

CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault); 

作爲來自CGContextDrawPDFPage taking up large amounts of memory的推薦,但這似乎並沒有解決我的問題。

我通過分析器運行它以查看發生了什麼事情,並且它慢慢開始分配一堆內存,直到最終達到512MB的活動字節並死亡。 memory allocation profiled in instrument

奇怪的是,當我使這個到圖像(在設備上顯示)背景下,似乎很好地工作,但是當我把它渲染到PDF上下文(帶有註釋的電子郵件),它打破。我試過的所有其他PDF都能在兩種情況下正常工作。

我希望有人編寫PDF閱讀器/註釋器可以測試這個,看看這個文檔是否適用於他們,如果是這樣,給我一些關於他們在做什麼來減少CGContextDrawPDFPage的內存分配的技巧。

另一個資源我看着是這個偉大SO Question.

編輯(在崩潰的更多信息):

gdb的行顯示的時間

90%的大跌實際上並沒有顯示出來,但該應用程序消失,堆棧跟蹤不顯示。 (它說暫停但沒有線程顯示)。有一次,我看到這是一個EXC_BAD_ACCESS,並在日誌中表明這一點:

malloc: *** mmap(size=16777216) failed (error code=12) 
*** error: can't allocate region 
*** set a breakpoint in malloc_error_break to debug 
+0

什麼是實際的崩潰? – 2012-02-29 18:49:25

+0

我已經添加了關於崩潰的編輯。 – 2012-02-29 20:05:53

回答

1

你在主線程構建PDF?如果是這樣,您可能不會收到內存警告,因爲您在執行過程中阻止了信號,因爲運行循環從未有機會向您發送消息。

+0

是的,現在它在主線上。如果我要對此進行解答並收到警告,那麼由於只有一次調用會導致內存用完,我該如何解決該問題? – 2012-02-29 20:25:36

+0

@PhilippeSabourin我在10.6.8上查看了Instruments中的PDF。無論是PDF的圖紙還是系統框架都有些問題。包括縮略圖,在需要超過** 10 GB **的預覽中打開文件 - 它正在創建大量圖像(可能來自矢量圖形?)。我無法對原始PDF文件格式有足夠的瞭解,看看發生了什麼,也沒有一個好的PDF編輯器來查看這個文件的內容(除非它是CGPDF實現中的一個不尋常的問題)。這個問題不在你的實現中=) – justin 2012-02-29 21:01:02

+0

@PhilippeSabourin如果你是該文件的創建者,那麼儘量減少這種影響,但我也建議在這個文件上提交Apple的一個bug。 – justin 2012-02-29 21:05:44

0

刪除Xcode中的異常斷點,它工作正常。

+0

這會在發佈模式下崩潰,出現內存不足錯誤,不確定刪除斷點會有什麼幫助。 – 2016-01-05 14:30:26