4

我正在创建一个 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 页的析构函数中,但似乎它们从未被调用过。

我怎样才能确保这个问题不会发生?

4

1 回答 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那么它将不会被销毁,除非您在 dispose 方法中删除此处理程序:

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

请注意,IDisposable接口是一种模式的一部分,它不像析构函数那样由运行时强制执行。您需要确定调用它的地点和时间。

还要注意将捕获您的变量的闭包,如果这些变量是实例字段,那么该实例也将被捕获。

从长远来看,您需要在网上搜索 C# 中的内存泄漏。在 SO 上,考虑到这一点,有很多问题,祝你好运。

于 2012-12-19T06:43:47.243 回答