Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Monotouch取消订阅活动_C#_Events_Memory Management_Xamarin.ios - Fatal编程技术网

C# Monotouch取消订阅活动

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

在我的MonoTouch项目中,我一直在使用事件而不是代理,通常使用这种模式,iPhone应用程序使用故事板:

我调用performsgue来表示一个新的视图控制器,在prepareforsgue方法中,我设置视图控制器的属性并使用lambda表达式订阅其事件,如下所示:

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的寿命没有它长

您的示例中不需要第二个示例,但如果:

控制器订阅将长期存在的对象上的事件,如模型/视图模型类 控制器订阅导航控制器堆栈中前一个控制器上的事件,模式控制器也是如此