如何清理Xamarin.iOS中的UIViewController?
考虑我们有一个自定义的UIViewContoller。如何清理Xamarin.iOS中的UIViewController?
现在我们必须对UIViewController卸载进行一些清理。例如,如果我们在视图控制器中使用UIWebView作为子视图,则建议将其代理设置为null
,并在卸载时调用StopLoading()
方法。
有些消息来源表示,不建议清理重写Dispose()
方法,因为它只涉及托管对象生命周期。
其他来源说,不建议使用ViewDidDissappear()
用于这些目的,因为它可以被调用两次。
如何处理它的权利?
ViewDidDisappear()
和ViewWillDisappear()
将不会被多次调用;至少不是没有对ViewDidAppear()
和ViewWillAppear()
的平衡调用。如果您看到更多致电方法消失方法比出现方法,您的代码中有一个错误。如果你想确保,你的清理只发生一次(理智),但不是解决事情如此简单:
bool myCleanupIsDone = false;
public override void ViewDidDisappear()
{
if(myCleanupIsDone)
{
return;
}
myCleanupIsDone = true;
CleanUpWhateverNeedsToBeCleanedUp();
}
你应该几乎never need to overrideDispose()
,除非你正在处理非托管资源。 Xamarin.iOS在内部做了很多工作,但是对于你的代码,在你的情况下它是不相关的。
通常你会在ViewWillAppear()
中创建你需要的对象并在消失方法中清理它们。这样你就不需要检查是否已经清理了一些东西。
ViewWillDisappear
和ViewDidDisappear
实际上可以在iPhone上进行多次调用,例如每当新控制器出现或推送时。但我认为它仍然是进行所有必要清理工作的合适地点。
一旦您的控制器第一次消失,Krumelur的建议将以您的UIWebView
的空代表结束 - 如果用户回来,它可能会崩溃。
因此,不要设置一个标志,你可以检查,如果你想要清理的控制器被弹出或解散 - 如果是这样的话,你可以安全地完成所有的工作。
下面是一些代码,我在我的一个项目发现(好像我已经通过这个前;)):
public override void ViewDidDisappear(bool animated)
{
if ((NavigationController == null && IsMovingFromParentViewController) ||
(ParentViewController != null && ParentViewController.IsBeingDismissed))
{
CleanUpAfterDisappearing();
}
base.ViewDidDisappear(animated);
}
也许你可以清理资源时,操作系统指示您的应用程序这样做通过覆盖自定义视图控制器中的DidReceiveMemoryWarning()方法:http://iosapi.xamarin.com/index.aspx?link=M%3AMonoTouch.UIKit.UIViewController.DidReceiveMemoryWarning
什么时候调用取决于_what_的意图。如果控制器出现时某些东西被初始化,那么每次清理都是非常有意义的。 – Krumelur 2015-03-21 06:13:06
当然,但您的示例只提出一次加载/初始化,所以它不会以这种方式工作。 – 2015-03-21 09:58:12