4

我有一個iPad應用程序在iPad上崩潰(第一個模型),因爲它內存不足。真正的內存不斷增加 - 從視圖中刪除子視圖 - iOS(ARC)

在應用程序中,我有一個主視圖,其中添加了20 UIScrollViews(自定義類)的子視圖,每個視圖都包含UIImageViewUIImage。當用戶移動到下一頁時,我從超級視圖中刪除所有這些子視圖,然後將20個新的UIScrollViews添加到同一視圖。

如果我剖析應用程序的分配和內存泄漏,一切正常 - 分配的內存保持在2MB左右,而用戶左右滾動。

但是,如果我看一下活動監視器中真正的內存使用情況,我可以看到每當用戶移動到新頁面時,實際內存就會增加大約20MB。最終在幾個新頁面後,應用程序大小達到150多MB並崩潰。

任何人都可以提出什麼可能會導致這種類型的行爲,以及如何進一步排除故障?上的應用程序結構的更多

只是有點信息:

  • 鑑於沒有加載圖像使用initWithContentsOfFile裝入NSMutableArray

回答

1

你不應該在一個數組中維護這些圖像。圖像消耗不成比例的有限RAM。有幾種方法:

  1. 如果你想保持簡單,就不要將圖像存儲在任何地方。通過initWithContentsOfFile加載圖片並加載UIImageViewimage屬性並將其稱爲一天。

  2. 如果您出於性能方面的原因想要一些RAM緩存,則可以使用imageNamed而不是initWithContentsOfFile。當應用程序收到內存警告時,緩存將自動清除。

  3. 我傾向於使用initWithContentsOfFile,但隨後在自己的NSCache手動緩存(這就像一個NSDictionary,除了可以設置它應該有多少圖片掛到一個countLimit)。

順便說一句,您沒有描述「用戶移動到下一頁」時在技術上會發生什麼。如果你只是刷新現有視圖控制器上的現有控件,那麼一切都可能是好的(一旦你解決了我上面討論的NSMutableArray問題)。如果您正在推送/呈現給另一個視圖控制器或滾動屏幕上的控件,但忽略從他們的超級視圖中刪除舊視圖,那麼這也會導致問題。你可能想澄清你在那裏做什麼。底線,你只需要確保當你從一個頁面到另一個頁面時,你不會保留對任何舊圖像或控件的強引用。

+0

這一切都發生在相同的UIView。這些對象被添加到視圖中,被刪除,然後添加新的(在這種情況下是一個自定義的UIScrollView)對象。我仍然不清楚我的原始問題 - 爲什麼只有在新對象添加到視圖(通過self.view addSubview x)時,真實內存纔會增加?這些對象被放置在viewDidLoad方法的數組中,並且實際內存在此時不會增加(它很低且不變)。 – GuybrushThreepwood 2013-04-27 17:00:01

+0

@Ohnomycoco在這種情況下,我們可能需要查看一些源代碼來診斷問題。但顯然,當你進入下一頁時,你正在添加一些東西。根據目前共享的內容進行診斷是不可能的。 – Rob 2013-04-27 17:11:41

+0

@Onomycoco您也可以使用Allocations工具(如[此處](http://stackoverflow.com/a/14105056/1271826)所示)來確定分配中的跳轉,突出顯示圖表的一部分,並顯示你正是什麼導致了內存的消耗。 – Rob 2013-04-27 18:41:47

相關問題