我的问题是这样的:
仍未调用子类的viewdidunload!
答案 0 :(得分:11)
正如其他人所提到的,viewDidUnload是UIViewController的一个方法。它不能保证被调用。当应用程序释放控制器的视图以释放内存时,它仅在低内存情况下被调用。这使您有机会发布您可能保留为控制器属性的任何视图子视图。
如果你在视图控制器的视图上调用removeFromSuperview,那么你可能在它没有设计用来处理的上下文中使用UIViewController。视图控制器旨在管理全屏视图。预计这些观点将在iPhone上的少数几种情况下呈现:
只要您在这些上下文中使用视图控制器(以及iPad上的其他几个上下文),您就可以通过loadView,viewDidLoad,viewWillAppear:animated:,viewDidAppear:animated可靠地管理视图的生命周期:,viewWillDisappear:animated:和viewDidDisappear:animated:和viewDidUnload方法(再次,请记住,不会总是调用viewDidUnload)。
通常情况下,您应该将视图控制器的视图传递给addSubview:是将根视图控制器的视图添加到窗口时。如果您想尝试使用嵌套视图控制器来管理非全屏子视图,则必须在适当的时间从全屏视图的控制器中手动调用其viewWill / DidAppear / Disappear:animated:和viewDidUnload方法。 / p>
答案 1 :(得分:3)
viewDidUnload
UIViewControllers
时调用 view
,而不是从view
移除子视图时调用。{/ p>
答案 2 :(得分:0)
viewdidunload是UIViewController的一个方法。如果您正在使用UIViewController子类来创建对象,并且该对象的视图已从superview中删除,则将调用viewdidunload。确保您的子视图是从UIViewController制作的。
答案 3 :(得分:0)
另外需要注意的是,在dealloc之前可能没有执行viewDidUnload。当UIViewController引用计数达到0时会发生这种情况。
正如Xcode模板所说:
- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}