2010-10-16 38 views
3

我正在開發應用程序,在可縮放的UIScrollView中有一個視圖。當用戶放大或縮小時,我將UIScrollView中的視圖重新繪製爲非常銳利。該視圖具有使用CGContextDrawTiledImage繪製的背景圖像。在不同的縮放環境下使用CGContextDrawTiledImage導致海量內存增長

我注意到,每次切換到新的縮放級別時,內存使用量都會增加。它看起來像CGContextDrawTiledImage保持緩存在不同大小的圖像的某處。所以,如果我從1.0放大到1.1倍,內存使用量會增加。回到1.0並不會導致它增長,但隨後到1.05然後1.2導致它增長兩倍。回到1.1並沒有增長。當然,縮放級別在用戶控制之下,所以我無法控制發生多少縮放級別。現在我的背景圖像是一種巨大的(512x512),所以這會導致內存使用迅速增加非常。它不會在儀器中顯示爲內存泄漏,只是額外的分配永遠不會被釋放。

我試圖找到一種方法來釋放似乎正在創建的緩存,但沒有運氣。例如,它似乎沒有響應低內存警告。

我也嘗試將視圖的backgroundColor設置爲使用colorWithPatternImage創建的UIColor,但這不起作用,因爲我通過更改圖形上下文的CTM而不是通過設置視圖的變換來進行縮放。

關於如何防止內存使用被炸燬的任何想法?

回答

0

每當我在圖形上下文的CTM中繪製不同的縮放比例時,Quartz顯然會保留某種類型的CGImage緩存。要解決這個問題,當我收到低內存警告時,我釋放圖像,然後在下次需要時懶惰地重新初始化它。不完美,但我能找到最好的。

我提出了一個蘋果的錯誤,但沒有真正的迴應。

0

您是否試過改變您傳遞給CGContextDrawTiledImage的矩形而不是(或之前)更改上下文的CTM?

+0

我剛剛試了一下。它具有與上述相同的效果。太糟糕了,因爲它看起來很有前途。 – Jacques 2010-10-17 01:36:22

0

你是如何加載圖片?如果您使用+ imageNamed:那麼加載的圖像將永久緩存iOS,+ imageWithContentsOfFile:更好。

+0

我正在使用Quartz API與CGImageCreateWithJPEGDataProvider一起加載它。我終於找到了解決方案,但沒有在這裏發佈。 – Jacques 2011-01-09 01:26:54

0

建立在Jacques的答案,我發現我可以清除緩存,只需複製CGImageRef並釋放舊的。其他比例的緩存不會複製到新的參考。

我把這種從任何地方我改規模:

/** 
* Switcheroo to persuade CGImage to drop the many megabytes of cache 
* it creates when changing scale. 
*/ 
- (void)discardRenderedImageCaches { 
    CGImageRef newImageRef = CGImageCreateCopy(renderedImageRef); 
    CGImageRef oldImageRef = renderedImageRef; 
    renderedImageRef = newImageRef; 
    CGImageRelease(oldImageRef); 
}