Monotouch / iOS:哪个地方是取消订阅委托最好的地方
iOS中订阅事件的最好方法是ViewDidLoad,但是当closures视图时,不会调用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; }
使用ViewDidLoad
和ViewDidUnload
,这些是从UI订阅/取消订阅事件的合适位置。
这里是一个关于iOS的内存pipe理的一般性文章,我认为这里适用: http : //www.buildingiphoneapps.com/buildingiphoneapps/2010/6/25/memory-management-and-viewdidunload.html
现在,如果你不希望事件在视图不可见的情况下运行,那么在事件处理器中做这样的事情:
if (IsViewLoaded && View.Window != null) { //code here }
我发现这是判断视图是否在屏幕上的最简单的方法。
我同意,最好的时间是在ViewWillAppear / ViewWillDisappear,而不是ViewDidUnload。
ViewDidUnload被称为后iOS 6: https : //developer.xamarin.com/api/member/UIKit.UIViewController.ViewDidUnload()/