2012-01-14 41 views
0

以最簡單的形式,我的應用程序顯示10個UIImageView,每個包含一個圖像。即使所有包含圖像的UIImageViews,我的應用程序都使用足夠小的內存佔用量。但是,有一個按鈕可以通過將所有圖像設置爲零來清除所有UIImageView。問題是,當在樂器中檢查內存監視器時,由UIImageViews保存的內存不會消失。這不會出現在分配工具中,確認剩餘內存佔用不是對象,而是基於圖形的內存。如果我將圖像大小調整爲更小或更大,則剩餘的內存也會分別變小或變大。UIImageView不能正確釋放圖像數據?

爲什麼圖像數據在UIImageView的圖像設置爲零後仍然存在?

回答

1

我相信UIKit會保留圖像緩存以供重用。 UIImageView可能會釋放該對象,但出於性能方面的考慮,會保留副本。

儘管這些圖像應該在接收到內存警告時發佈。如果他們不是,我會檢查兩個地方:

  1. 確保UIImageView被釋放。使用分配工具來分析你的應用程序,並做任何你需要做的程序來加載這些圖像。然後卸載圖像並搜索UIImageView。只要你確定你的程序應該已經發布了所有的程序,如果你在搜索中發現任何東西,你就知道某些東西是錯誤的。
  2. 我還會檢查圖像的創建位置,例如:UIImage = [UIImage imageName:@"Foo.jpg"];確保這些圖像也被釋放。您可以使用分配來查找UIImage類,但要清除那些應該/不應該在那裏的類將更加困難。
  3. 運行靜態分析器:在Xcode 4中,它位於產品 - >分析下。這是一個很好的工具,用於發現邏輯錯誤,過度釋放/釋放(如果你不使用ARC)等。
+0

理論上這個緩存不會在應用程序收到內存警告時被釋放嗎?儘管有警告,它仍然存在於我的應用程序中。 – 2012-01-14 19:43:38

+0

是的,我非常肯定,我在某處讀取緩存內容時會收到內存警告,因此看起來存在問題。我會更新我的答案。 – 2012-01-14 23:08:04

-1

直到實際的UIImageViews本身被釋放,它們的內存將保持分配。此外,如果你使用上的UIImage方便的方法來獲得你的圖像,例如:

UIImage *myImage = [UIImage imageNamed:@"myImage"]; 

注意你的形象可以通過iOS的緩存幕後的,所以即使圖像是由您發佈內存佔用可能仍然反映了內存中的圖像存在(最終iOS會釋放它,所以這不應該對您的資源消耗產生不利影響)。

+0

我已經創建了我自己的[UIImage loadImage:]類別方法,以便更好地控制緩存和不緩存的內容,另外我從磁盤讀取這些圖像,而不是從應用程序包中讀取圖像,因此imageNamed:cache不應該成爲一個問題。此外,如果我在ARC中,發佈這些對象的最佳方式是什麼?設置爲零似乎並沒有刪除內存。 – 2012-01-14 19:42:15