不为XAML页面调用析构函数

时间:2012-12-19 05:34:19

标签: c# windows-phone-7 garbage-collection windows-phone-8

我正在创建一个Windows Phone(8)应用程序。我有2个XAML页面。如果我手动测试以下内容:

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

最终(来回切换~15次),应用程序耗尽内存并崩溃。我将调试语句放在第1页和第2页的析构函数中,但看起来它们永远不会被调用。

如何确保不会发生此问题?

1 个答案:

答案 0 :(得分:4)

当c希望这样做时,一般对象中的c#被破坏,没有办法强迫它去做。虽然很懒,但我不会让你的记忆耗尽。因此,您希望销毁的对象尚未准备好被收集。如果没有准备好,我的意思是在您的应用程序中,您在某处可以引用此对象。其中一些参考文献显然是整个过程中的一个阶段,其他人更难以发现这一点:

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#中的内存泄漏。在这方面有很多问题,考虑到这么好运。