我正在创建一个 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 页的析构函数中,但似乎它们从未被调用过。
我怎样才能确保这个问题不会发生?
我正在创建一个 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 页的析构函数中,但似乎它们从未被调用过。
我怎样才能确保这个问题不会发生?
我 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 上,考虑到这一点,有很多问题,祝你好运。