Monotouch / iOS:哪个地方是取消订阅代表的最佳地点

时间:2012-04-14 16:31:54

标签: ios delegates xamarin.ios unsubscribe

iOS中订阅事件的最佳方法是ViewDidLoad,但是当关闭视图时,不会调用ViewDidUnload()(仅当内存警告时。)

哪个地方最好取消订阅活动?

(在subviewController中我订阅了一个引用MainViewController的事件,当打开子视图两次时,我收到两个事件触发器,因为从未调用viewdidunload()中的取消订阅。)

ViewWillAppear / ViewWillDisapper中的订阅/取消订阅怎么样?

    public override void ViewWillAppear (bool animated)
    {
        base.ViewWillAppear (animated);

        this.mBL.OrderChanged += HandleOrderChanged;            
    }

    public override void ViewWillDisappear (bool animated)
    {
        base.VieWillDisappear (animated);
        if (this.mBL!=null)
          this.mBL.OrderChanged -= HandleOrderChanged;          
    }

2 个答案:

答案 0 :(得分:1)

使用ViewDidLoadViewDidUnload,这些是从UI订阅/取消订阅事件的合适位置。

以下是iOS中关于内存管理的一般文章,我认为适用于此:http://www.buildingiphoneapps.com/buildingiphoneapps/2010/6/25/memory-management-and-viewdidunload.html

现在,如果您不希望在View不可见时运行事件,请在事件处理程序中执行以下操作:

if (IsViewLoaded && View.Window != null) {
  //code here
}

我发现这是判断视图是否在屏幕上的最简单方法。

答案 1 :(得分:0)

我同意,最好的时间是ViewWillAppear / ViewWillDisappear,而不是ViewDidUnload。

调用ViewDidUnload,称为iOS 6后: https://developer.xamarin.com/api/member/UIKit.UIViewController.ViewDidUnload()/