2009-07-30 93 views
1

要從CGLayer DOC報價:石英緩存CGLayer

石英緩存被重用的任何對象,包括CGLayer對象。

我在大頁面上遇到內存問題,我試圖實現一個簡單的機制,根據視圖是否在開/關屏幕上發佈和重新創建視圖。

爲了簡單起見,我有一大堆UIImages,作爲網絡請求的結果創建,保存在某個數組中。我創建了一個UIImageView,像這樣:

anImage = [anArray objectAtIndex:0]; 
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage]; 
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw 
[imgView release];    // owned by mainView now 
[...]       // wait a bit for draw cycle 
[imgView removeFromSuperview]; // memory doesn't go down 

imgView去離屏幕是removedFromSuperview和釋放。好吧?不存在 - 石英中存在的CGLayer不會被刪除,因爲anImage仍然存在。

我怎樣才能解決這個問題?在這種情況下唯一的方法是在Quartz後面用不同的指針地址創建一個完全相同的圖像並刪除舊的圖像。唯一的方法就是「深度複製」圖像(UIImage不執行NSCoding)或通過網絡再次請求(慢速)。

我在想什麼是我需要將我的圖像添加到數據庫中,並在每次查看屏幕時重新提取它們,但我很想聽到人們對此的看法。

回答

1

在這裏,你從0增加至imgView 1

UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage]; 

在下一行,在MAINVIEW incrementes引用計數。 (現在是2)

[mainView addSubview:imgView]; // Quartz eats memory for view after first draw 

在這裏,您釋放imgView並且引用計數回落到一。

[imgView release]; // owned by mainView now 

我不認爲你的記憶問題與anImage有什麼關係。只要imgView是子視圖,它不會釋放該對象,因爲它需要該對象繪製到屏幕上。

什麼以下行指的是,如果您以編程方式提請你CGLayer,石英與緩存你畫什麼,所以你是不是經常重繪同樣的事情。這與添加子視圖無關。

石英緩存任何重用的對象,包括CGLayer對象。

+0

感謝您的回覆。簡化我的示例(現在編輯)時,我犯了一個錯誤,但UIView肯定會得到釋放。我已經做了大量的測試。內存永遠不會被釋放,直到UIImage本身被釋放。 – Sam 2009-07-30 20:30:18