我最近从MVVMLight 3升级到4,并注意到我的命令崩溃了。事实证明,在新的RelayCommand(在3.5版中实现)中使用弱引用导致我使用的代码构造失败。我知道有一些关于内存泄漏的弱参考的论据,我只是不明白。
这失败了:
private void InitCommand()
{
Command = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this).Command;
}
失败了,我的意思是当我去使用我初始化和绑定的Command属性时,它的后备方法已被垃圾收集并且Command无法执行。有趣的是,Command对象仍然存在,只是SwitchMainGridCommand上的支持属性现在消失了。在RelayCommand中的弱引用之前,尽管未明确保留SwitchMainGridCommand,但引用Command仍然保持支持属性可用。
这成功了:
SwitchMainGridCommand<SwitchMainGridToolViewModel> _refHolder = null;
private void InitCommand()
{
_refHolder = new SwitchMainGridCommand<SwitchMainGridToolViewModel>(this);
Command = _refHolder.Command;
}
在正在分配Command的ViewModel上创建_refHolder类变量将保留引用_refHolder.Command的方法/属性。
我想这是弱参考的理想行为,我只是不确定为什么需要它。
答案 0 :(得分:1)
以下是来自MSDN的关于弱引用和强引用的文章: MSDN Goodness
答案 1 :(得分:0)
也许,我可能因为这个原因重复:
在MvvmLight逻辑和其他mvvm样式中,ViewModel使用Locator“链接”到视图。 现在当你的xaml页面向前移动到下一页上一页的Vm仍然存在时,使用命令weak可以轻松释放内存。
第二个很简单,可以更好地控制对象的生命,让定位器唯一能够保存Viewmodel的引用因此唯一可以决定何时何地释放
我希望这可能会对你有所帮助,如果一个vm仍然存在一段时间并不是真的很重要,我主要是当你的软件没有使用真正巨大的内存时。 Alloc和dealloc影响了软件的性能