要從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)或通過網絡再次請求(慢速)。
我在想什麼是我需要將我的圖像添加到數據庫中,並在每次查看屏幕時重新提取它們,但我很想聽到人們對此的看法。
感謝您的回覆。簡化我的示例(現在編輯)時,我犯了一個錯誤,但UIView肯定會得到釋放。我已經做了大量的測試。內存永遠不會被釋放,直到UIImage本身被釋放。 – Sam 2009-07-30 20:30:18