2012-04-13 58 views
1

我在我的iPod有一個應用程序。ios開發的內存管理奇怪的事

1.Open的應用程序,並在內存儀器看(活動監視器),這是8.95M

2.click一個按鈕,它會與一個大的圖像添加一個UIImageView到屏幕,內存現在是17.8M。

3.從屏幕上移除UIImageView,等待一秒鐘,現在內存爲9.09M。

我確定UIImageView是從屏幕上移除後發佈的。這是非常簡單的代碼。 所以當它被移除時,應用程序的狀態應該與之前一樣,將UIImageView添加到屏幕上,對嗎?但爲什麼內存是9.09M而不是8.95M?如果您向屏幕添加更復雜的視圖,則差異更加明顯。

+1

如果您再次打開相同的圖像,然後一遍又一遍地移除它,它是否每次增長相同的數量?如果是這樣,這是一個內存泄漏。如果不是,這是正常的。 – 2012-04-13 10:56:06

+0

不,它不會。記憶保持9.09M。但這是問題所在。我有一個視圖時添加刪除,300k內存添加! – Ning 2012-04-13 11:04:45

+3

如果內存保持在9.09M並且在打開和關閉視圖時不增長,那麼您沒有內存泄漏。這是正常的。您無法將所有資源完全返回到系統。其中一些人一直停留在應用程序中。只要應用程序可以重新使用它們,這不是問題。 – 2012-04-13 11:07:19

回答

3

這是正常的。這是由於「懶散增長,懶惰收縮」算法。這意味着您的數據結構可以根據少量項目或大量項目進行調整。少量物品的尺寸使用很少的內存,但在處理大量物品時效率不高。大數字的大小對於管理大量的事物是非常有效的,但是使用更多的內存來索引對象。

「懶惰的成長,懶惰的收縮」算法試圖通過僅增長索引來調整結構索引的成本,如果它太小而只是在它太大時才縮小。例如,一個典型的算法可能會增長索引,只有當它的理想尺寸至少比它大三倍時纔會增長,並且只有在其理想尺寸的三倍以上時才縮小它。如果應用程序快速分配並釋放資源集合,則需要這樣做以防止大量的調整大小操作 - 您希望索引大小有點「粘性」。

當您打開大對象並使用GUI對象時,會使索引太小,並且它會增長。但是當你關閉這個大對象時,你只會讓索引太大,所以它不會縮小。

如果設備受到內存壓力,索引將縮小。如果應用程序繼續減少對UI資源的使用,索引將縮小。如果應用程序使用更多的UI資源,則索引不需要儘快再次增長。

一個很好的比喻可能是桌子上堆滿了紙。如果你有30份文件可能需要查找,你可以將它們保存在4個堆棧中。但是如果你有5,000篇論文,4堆將會讓搜索變得乏味。在這種情況下你需要更多的堆棧。所以當紙張數量太多而沒有4個堆疊時,您需要重新索引到更多堆疊。但是,當數量變小時,除非搜索仍然非常快,否則不會經常重新編制索引,直到您找到太多堆棧爲止。

當您處理完所有這些文件後,您的辦公桌還有一些額外的堆疊。這可以避免下次需要處理大量論文時重新編制索引。

+1

感謝您的詳細解答!現在我很清楚了~~ – Ning 2012-04-13 15:41:34