面積

2017-06-14 72 views
0

我已經創建了一個應用程序有12個視圖控制器和它得到了很多圖形的iOS應用程序的內存使用(圖像文件)面積

當我啓動的應用程序,我注意到內存上漲,因爲我通過移動視圖控制器。一旦我已經完成了所有的控制器移動內存530MB

所以我的問題是: -

一),這是一個很大的內存來使用 二)我應該擔心 c)我如何從內存中刪除視圖控制器,當我導航回合..例如我有一個視圖控制器上博但是一旦有人點擊跳過或開始,我會繼續看下一個視圖控制器,因此理論上它不需要再加載。

想法?

我運行在iPhone 7 Plus上,它具有3Gbm,但希望能夠在iPhone SE之後的其他手機型號上運行該應用程序。然而,我注意到內存配置文件是大約50%沒有iPhone本身,而是假設那是因爲它不加載X3圖像按加電話

回答

1

一),這是一個很大的內存來使用

很多是相對術語,530Mb是否完全取決於應用程序在做什麼以及它是什麼類型的應用程序!如果它的遊戲具有豐富的圖形功能,我不會受到太多的困擾,但如果它是一個簡單的實用程序,我會擔心的!

二)我應該擔心

內存得到累積/爲用戶負載增加應用程序的各種屏幕是一種非常常見的場景。如果它不斷增加,永遠不會下降,你應該感到困擾。每次VC加載時都可能會加載,使用它的圖形很大,或者可能會分配大量變量並消耗大量內存來執行其功能。這很公平。但是,一旦用戶從應用程序導航堆棧中彈出VC,應該返回由VC分配的所有內存,並且應用程序消耗的內存總量應該減少。理想的記憶足跡看起來就像是一個達到高峯的波形,一旦VC彈出,它就會下降。如果那沒有發生,你有麻煩了:)

三)如何從內存中刪除視圖控制器爲我導航輪

  1. 使用適當的導航技術。除非實際需要將VC實例保留在內存中,否則不要將VC推到導航控制器堆棧。所有推到導航堆棧的VC都將繼續保留在內存中,直到用戶殺死應用程序或者iOS決定在接收到內存警告時關閉應用程序爲止。

  2. 在每個VC中寫入deinit/dealloc,並確保每次用戶彈出VC時都會調用該按鈕,方法是按下按鈕(如果按下按鈕),或者如果VC以模式形式呈現則關閉VC。確保每個VC的deinit被調用是確保VC不會佔用任何不必要的內存的最佳方式。

  3. 確保您的VC中沒有代碼會導致保留週期並將對象永久保留在內存中。例子:如果你的VC聲明瞭一個塊並且擁有對塊的強引用,並且你傳遞了自己來阻止你的塊,那麼自己永遠不會被釋放。典型的保留週期例子。確保你的代碼不會產生這樣的死鎖

  4. 永遠不要堅持任何東西強烈使用strong/retain,除非它是必要的。

  5. 使用工具來查找每個對象的內存泄漏和引用計數,以確保在應用程序中沒有內存泄漏。

+0

@ sandeep-bhandaripp感謝您的信息...幾個進一步的問題..一位新手,但你是什麼意思適當的導航技術?我創建了一個單一視圖應用程序,並在它們之間添加了各種VC和seque,這是錯誤的嗎? 也讀了關於ARC,我假設VC會放手,但我使用SWIFT 3,所以你如何決定VC? – user2596590

+0

@ user2596590:如果您使用push/show segue,則View Controller會被推入導航堆棧。直到用戶通過點擊返回按鈕或殺死應用程序來彈出ViewController時,推送到導航堆棧的視圖控制器纔會被釋放。所以你應該使用push,如果你真的想要VC堅持,並允許用戶回到屏幕上回來。如果你推入loginVC,那麼loginVC也會被保留,但登錄是一次性使用,你不希望用戶通過點擊回到這個屏幕,使用push將使得LoginVC保存在內存中 –

+0

因此,你所有的VC不希望它堅持你使用模態segue並解僱它以擺脫它,一旦使用這將不會使VC保存在內存中。類似地,每當用戶點擊推送的VC上的後退按鈕並從導航堆棧彈出VC時,VC的deist/dealloc被調用。確保它被調用。如果它沒有被調用,那意味着你的VC被某些不允許它釋放的東西所控制。因此記憶不會下降。 –