我看过'Messenger和引用'讨论,但我正在写一个新主题,因为我的问题不是技术性的,我不想在那里离题。
我遇到了一个疑问-我是否需要编写
Messenger.Register的描述是:“……注册收件人不会创建对其的硬引用,因此如果删除此收件人,则不会导致内存泄漏。” 1)这是否意味着我不必担心它并实现开发以下解决方案?
另一方面,在
我遇到了一个疑问-我是否需要编写
cleanup()
/RequestCleanup()
方法的实现来注销先前在我的视图模型类中注册的Messenger?我担心未来会出现内存泄漏问题。我认为我找到的文档对我来说不够清晰。Messenger.Register的描述是:“……注册收件人不会创建对其的硬引用,因此如果删除此收件人,则不会导致内存泄漏。” 1)这是否意味着我不必担心它并实现开发以下解决方案?
另一方面,在
GalaSoft.MvvmLight.ViewModelBase
抽象类的代码中,我们可以找到关于Cleanup()
方法的简短信息: //
// Summary:
// Unregisters this instance from the Messenger class.
// To cleanup additional resources, override this method, clean up and then
// call base.Cleanup().
public virtual void Cleanup();
所以2)仅调用Cleanup就足以从Messenger中注销类实例吗?
3)还是说我必须在Cleanup方法的主体中调用?
4)在Unregister(Object)文档中,我们读到“完全取消注册消息接收者” - “完全”是什么意思?
如果我的帖子似乎引用了上下文之外的内容,我非常抱歉,我想指出我更感兴趣的内容。
编辑1:
你好Joel,谢谢回复。我有几个问题:
1)我使用了你的代码。CustomerMasterViewModel中定义了覆盖void Cleanup()。在哪里调用它?在这种情况下应该声明析构函数,还是ViewModelBase有一个自动机制来调用Cleanup()?
2)在我的项目中,我有另一个来自不同工具包的基类,因此我的VM无法同时继承两者。如何组织您的代码以通过仅实现ICleanup接口获得相同的效果?
public class CustomerMasterViewModel : SomeBaseClass, ICleanup
{
public CustomerMasterViewModel()
{
Messenger.Default.Register<Message>(this, this.MessageReceived);
}
#region messages
private void MessageReceived(Message obj)
{
//do something
}
#endregion
#region helper methods
public override void Cleanup()
{
//base.Cleanup();//there's no implementaction in an interface
ViewModelLocator.Cleanup();
}
#endregion
}