viewdidunload根本没有被调用

时间:2011-04-08 11:32:13

标签: iphone ipad view

我的问题是这样的:

  1. 父类加载子视图。
  2. Child在操作期间使用“removeFromSuperView”删除自身。
  3. 当子项被删除时,父类会获得委托调用,从而使子对象为nil。
  4. 仍未调用子类的viewdidunload!

4 个答案:

答案 0 :(得分:11)

正如其他人所提到的,viewDidUnload是UIViewController的一个方法。它不能保证被调用。当应用程序释放控制器的视图以释放内存时,它仅在低内存情况下被调用。这使您有机会发布您可能保留为控制器属性的任何视图子视图。

如果你在视图控制器的视图上调用removeFromSuperview,那么你可能在它没有设计用来处理的上下文中使用UIViewController。视图控制器旨在管理全屏视图。预计这些观点将在iPhone上的少数几种情况下呈现:

  1. 作为窗口根视图控制器的全屏视图
  2. 作为由UINavigationController管理的屏幕层次结构中的全屏视图
  3. 作为标签中显示的全屏视图
  4. 使用presentModalViewController呈现的全屏视图:animated:
  5. 只要您在这些上下文中使用视图控制器(以及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;
}