0

我正在使用單聲道機器人,使用slodge提供的mvvmcross框架。不過,我有一些內存問題。我將位圖放置在ondestroy方法的活動中,我想知道是否可以幫助GC收集未使用的viewmodels對象。如果您嘗試將活動中的viewmodel設置爲null,則它將全部變爲地獄,而且顯然不是正確的方法。使用mvvmCross幫助單聲道機器人中的GC

你們對這種方法有什麼建議嗎?

問候

+0

我有一個類似的問題,其中的對象只是沒有被GC快速釋放足夠。我在OnDestroy中添加了「GC.Collect()」,並開始正確清理。即使當我的所有圖像都在佈局中。 – cdbitesky

回答

1

的MVX框架試圖確保活動擁有視圖模型。

所以理論上,在你的活動被破壞後,gc應該能夠收集你所有的c#對象 - 活動,它擁有的視圖,視圖模型和它擁有的對象。

我在哪裏看到這個問題出在哪裏,任何'全局'或單體對象擁有對視圖或視圖模型對象的引用。例如:

  • 如果一個視圖本身註冊到一個單 - 例如一個http圖像加載器 - 然後該單保持對視圖的引用,防止它被垃圾收集。

  • 如果一個viewmodel訂閱中央服務(通常是一個singleton)上的事件並且不退訂它 - 那麼在這種情況下viewmodel不能被垃圾收集(並且通常這也會阻止其他對象也被收集)

通常這兩種類型的錯誤都可以通過對活動銷燬執行清理操作來解決。然而,其他方法也可用 - 例如,對於事件訂閱,您可以嘗試使用弱引用(這也是在其他平臺上採用的方法 - 例如mvvm light的使者)

根據經驗,泄漏最明顯的區域是像圖像這樣的「大物體」 - 它們的大小可以幫助它們變得引人注目。然而,monodroid的真正挑戰是確定泄漏的位置 - 修復它們通常比較容易。

不幸的是,目前還沒有可用於機器人的內存分析器。如果您正在交叉編譯爲wp7,那麼當然對於視圖模型對象/泄漏,您可以使用其內存分析器。如果不是這樣,那麼我通常試圖解決內存泄漏的方式就是放大它們 - 嘗試編寫一個快速重現它們的示例 - 例如,通過將大字節[]成員添加到數據元素或通過快速重複操作。一旦你很容易再現泄漏,那麼你可以嘗試通過在終結器中放置跟蹤語句,在事件刪除處理程序等中找到泄漏。