2012-12-19 52 views
4

我正在創建Windows Phone(8)應用程序。我有2個XAML頁面。如果我手動測試以下:析構函數未被XAML頁面調用

1. From 1st page, go to 2nd page 
2. Press the physical Back button. 
3. Go to #1. 

最終(AFTE來回切換〜15次),該應用程序運行的內存和崩潰。我在第1頁和第2頁的析構函數中放置了調試語句,但似乎從未被調用過。

如何確保不會發生此問題?

+0

我有同樣的問題,任何解決方案? – ericosg

回答

4

我c#中的一般物體在GC希望這樣做時被破壞,沒有辦法強制它去做。雖然這很懶,我不會讓你的記憶力耗盡。所以你期望被銷燬的物品還沒有準備好被收集。如果沒有準備好,我的意思是在你的應用程序中你有一個對這個對象的引用。其中有些引用是顯而易見的,如類,居住在整個過程中的一個字段,其他都很難點考慮:

class LongLivingClass // say main window or some other 
         // instance that lives considerably longer then the other 
{ 
    public event Action SomeEvent; 
} 


class ShortLivingClass // class that is created and should be destroyed 
         // many times throughout life of LongLivingClass 
{ 

    ShortLivingClass(LongLivingClass llc) 
    { 
      llc.SomeEvent += DoSomething; 
    } 

    void DoSomething(){/*.../*} 
} 

如果ShortLivingClass重視通過LongLivingClass那麼就不會被銷燬,除非你刪除此曝光事件處理程序在dispose方法:

void Dispose() 
{ 
    llc.SomeEvent -= DoSomething; 
} 

注意IDisposable接口是不一樣的析構函數運行時執行的圖案的一部分。你需要確定地點和時間來調用它。

也要注意閉包,它將捕獲你的變量,如果這些變量是實例字段,那麼實例也將被捕獲。

從長遠來看,您需要在網上搜索c#中的內存泄漏。因此,考慮到這個好運氣,有很多問題。

相關問題