C# Monotouch取消订阅活动
在我的MonoTouch项目中,我一直在使用事件而不是代理,通常使用这种模式,iPhone应用程序使用故事板: 我调用performsgue来表示一个新的视图控制器,在prepareforsgue方法中,我设置视图控制器的属性并使用lambda表达式订阅其事件,如下所示:C# Monotouch取消订阅活动,c#,events,memory-management,xamarin.ios,C#,Events,Memory Management,Xamarin.ios,在我的MonoTouch项目中,我一直在使用事件而不是代理,通常使用这种模式,iPhone应用程序使用故事板: 我调用performsgue来表示一个新的视图控制器,在prepareforsgue方法中,我设置视图控制器的属性并使用lambda表达式订阅其事件,如下所示: public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender) { if (segue.Identifier.Equals
public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
{
if (segue.Identifier.Equals("NextViewControllerSegue")) {
using (MyNextViewController destinationVC = segue.DestinationViewController as MyNextViewController) {
destinationVC.SomeProperty = "some value";
destinationVC.Cancelled += (s, e) => {
this.DismissViewController(false, null);
};
}
}
}
另一方面,我将这些取消的事件链接到我需要关闭视图控制器层次结构的地方——这是好是坏是另一天的问题
我的问题是:我最近发现,如果不取消订阅某个对象的事件,该对象就不会被垃圾收集。因此,我已将上述代码更改为:
public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
{
if (segue.Identifier.Equals("NextViewControllerSegue")) {
using (MyNextViewController destinationVC = segue.DestinationViewController as MyNextViewController) {
destinationVC.SomeProperty = "some value";
destinationVC.Cancelled += Cancel;
}
}
}
protected void Cancel (object sender, EventArgs e)
{
(sender as MyNextViewController).Cancelled -= Cancel;
this.DismissViewController(false, null);
}
我的问题是:这种模式是一种好的做事方式吗?在活动委托中,取消订阅活动的方法2是否有效?我不知道还有什么地方可以退订。或者我应该按照这里的建议移动所有内容以使用通知模式:?在您的第一个示例中,事件将导致destinationVC引用它。因为这在堆栈中很可能比导航控制器中的destinationVC低,所以实际上没有问题,因为destinationVC的寿命没有它长 您的示例中不需要第二个示例,但如果: 控制器订阅将长期存在的对象上的事件,如模型/视图模型类 控制器订阅导航控制器堆栈中前一个控制器上的事件,模式控制器也是如此