XAML页面的析构函数没有被调用

4
我正在开发一个 Windows Phone (8) 应用程序。我有两个 XAML 页面。如果我手动测试以下内容:
1. From 1st page, go to 2nd page
2. Press the physical Back button.
3. Go to #1.

最终(在来回切换15次之后),应用程序会耗尽内存并崩溃。我在页面1和页面2的析构函数中加入了调试语句,但似乎它们从未被调用。

我该如何确保这个问题不会发生?


我也遇到了同样的问题,有解决方案吗? - ericosg
1个回答

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公开的事件,则它将不会被销毁,除非在处理方法中删除此处理程序:

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

请注意,IDisposable接口是一个模式的一部分,不像析构函数那样由运行时强制执行。您需要确定调用它的位置和时间。
还要注意闭包会捕获您的变量,如果这些变量是实例字段,则该实例也将被捕获。
从长远来看,您需要在C#中搜索内存泄漏问题。在SO上有很多关于此的问题,祝您好运。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接