我正在创建一个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页的析构函数中,但看起来它们永远不会被调用。
如何确保不会发生此问题?
答案 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#中的内存泄漏。在这方面有很多问题,考虑到这么好运。