2012-09-19 35 views
23

我想在代碼中發現另一個內存泄漏,我似乎無法弄清楚CG柵格數據是什麼。在啓用自動快照的情況下瀏覽VM跟蹤器時,CG柵格數據似乎是唯一增加的部分。如果分配不增加,這些也會穩步增加。什麼是CG柵格數據?

我不完全確定CG柵格數據是什麼,也不知道我會如何修復它,但是在這一點上越來越多的腳印最終導致內存錯誤和崩潰,所以它不好!我做我自己的文本渲染(使用CoreText),所以我認爲這與它有關。我也在加載圖片?

下面是足跡的圖像: Peaks in the allocations when the pages load (the app loads pages with images and text discretely), the dirty memory always increases though.

UPDATE:「NSConcreteGlyphGenerator」此問題仍然存在,但有趣的是,我可以將其與UIFoundations一種叫做內泄漏它似乎只發生在實際繪製的CoreText方法中對屬性字符串調用「boundingRectWithSize:」方法時發生。該生產線,具體爲:

[displayString boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:0 context:nil]; 

慢慢地跟蹤了下去......

+4

你有沒有圖這一個呢?我有這個問題仍然在iOS 7中。 – Daniel

+0

有關於此的任何更新? @Daniel –

回答

1

這不是太多的答案,但只是讓別人得到調查開始...

我想CG柵格數據是iOS 6的新增功能,但在iOS 5中作爲CG圖像存在。我在兩個模擬器上進行了測試,在iOS 5上,CG柵格數據不存在,但如果您比較iOS 6和iOS 5上的總量,則CG圖像大約等於CG柵格數據,而CG圖像不會在iOS 6上顯示。所以我很確定他們只是將CG Image重命名爲CG柵格數據。

至於什麼CG圖片真的是,我一直在試圖找出幾個月。我認爲這只是與系統處理的視圖佈局相關的東西,你並不真正控制,因爲我的應用程序沒有任何UIImages或CG圖像,而且我的CG圖像內存非常高,所以它可能需要做的事情與核心動畫和視圖佈局。

+0

「CG圖像」目前仍然是iOS 6,至少在我的應用程序中。 –

+0

雅,對我來說,雖然它的痕跡非常小......但在iOS 5中它大約爲20 MB,在iOS 6中它最大爲32 KB。所以無論CG圖像是什麼,它不會在iOS 6 – Snowman

12

我不知道「CG柵格數據」可能包含的所有內容,但我知道它確實包含的一件事是......由Core Graphics分配用於存儲柵格數據(又名位圖)的內存。

具體來說,在我的應用程序中,我使用CGBitmapContextCreate創建了兩個256x256位圖上下文。我通過NULL作爲data參數,以便Core Graphics爲我分配位圖內存。每像素32位(4字節)的256x256位圖需要256 KiB = 64頁,每個4 KiB。在樂器中,我得到兩個「CG光柵數據」塊,每塊65頁。如果我註釋掉其中一個位圖上下文,那麼在Instruments中只能獲得一個65頁的「CG光柵數據」塊。

另一方面,我的應用程序中也有一個CATiledLayerCATiledLayer爲我設置了自己的圖形上下文,我相信它會使用共享內存創建這些上下文,即窗口服務器(iOS 6上的iOS 5,backboard上的springboard)也可以直接訪問這些上下文。我沒有看到與這些圖形上下文對應的任何「CG柵格數據」塊。

0

如果您關心內存使用情況(89MB),請稍等。你有沒有嘗試模擬模擬器中的內存警告(模擬器>硬件>模擬內存警告)?

我的猜測是它的內存被圖片圖片用完。

有可能到頭來你可能需要通過觀察內存警告訊息要解除您的圖像:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

清除所有圖像handleMemoryWarning方法的對象。

+0

中發揮如此重要的作用,如何清除所有圖像?意味着'image = nil'?或'self.view = nil'? – aircraft

2

我與CG光柵數據存儲器的問題相同,反覆推動和彈出視圖控制器增加。我花了一段時間認爲這是一個繪圖代碼的問題。我終於將它追蹤到了一個委託,它不會弱引用正在被推送和彈出的視圖控制器,所以當我彈出視圖控制器時,它並未被釋放。 CG柵格數據恰好是該視圖控制器佔位面積的最大部分,所以我最初錯誤地將問題歸結爲這個問題,當時它真的是視圖控制器本身沒有被釋放(因此,沒有公佈其觀點,其中有CG柵格數據)。

簡而言之:如果您發現CG Raster Data存在內存泄漏,請查看可能有視圖的視圖控制器,並確保它們正在發佈。

0

不是一個真正的答案。但一些更多的提示,我想通了,而解決我的CG-柵格數據泄漏:

  • 的CG-光柵數據保存CGIMageRefs的內存(至少從CGBitmapContextCreateImage()從CGBitmapContextCreate創建上下文創建(NULL,...)
  • 我的泄漏是一個缺失的CGImageRelease(),我使用該圖像作爲CALayer的內容傳遞並假定該屬性擁有引用,但似乎這個任務複製了圖像。至少我在調用CGImageRelease後沒有任何問題。

希望能幫助別人...

1

當我遇到這個問題時,「CG柵格數據」來自我從UIGraphicsBeginImageContextWithOptions中調用UIGraphicsGetImageFromCurrentImageContext所創建的圖像。我花了一天的時間來追蹤這個問題,最終與圖像製作完全無關。在我的情況下,我無意中在另一部分代碼中將圖像粘貼到我自己的NSCache中,而沒有意識到它。

如果您在CG柵格數據未發佈時遇到問題,您應該考慮數據創建位置的來源可能與實際問題沒有任何關係。這可能是因爲您不希望圖像數據被保留下來,而您在Instruments中看到的「CG柵格數據」標籤只是指數據的來源。你應該檢查一下,以確保你沒有像多個addSubviews那樣做,而無法移除FromFromSuperview(例如UIImageViews),或將圖像放入緩存,數組,強變量等。

+0

我似乎有一個非常類似的問題。你能詳細說明把圖像放入NSCache的問題嗎? – Kenneth