viewdidunload 根本没有被调用

Posted

技术标签:

【中文标题】viewdidunload 根本没有被调用【英文标题】:viewdidunload is not getting called at all 【发布时间】:2011-04-08 11:32:12 【问题描述】:

我的问题是这样的:

    父类加载子视图。 孩子在操作过程中使用“removeFromSuperView”将自己移除。 当子对象被移除时,父类会获得一个委托调用,从而使子对象为零。

仍然没有调用子类的 viewdidunload!

【问题讨论】:

这个问题应该被删除。 viewDidUnload 已被弃用,在 ios 6 中不再调用。 是的,但并不是每个人都只为 iOS 6 开发,所以我们最多应该注意,这已被弃用,因此不适用于 iOS 6,但继续认为它对那些人来说是一个有效的问题和答案为其他版本的 iOS 开发。 【参考方案1】:

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

如果您在视图控制器的视图上调用 removeFromSuperview,那么您可能是在它不是设计用于处理的上下文中使用 UIViewController。视图控制器旨在管理全屏视图。这些视图预计将在 iPhone 上的少数几个上下文中呈现:

    作为窗口根视图控制器的全屏视图 作为 UINavigationController 管理的屏幕层次结构中的全屏视图 在选项卡中显示为全屏视图 作为使用 presentModalViewController:animated 呈现的全屏视图:

只要您在这些上下文中使用视图控制器(加上 iPad 上的其他几个上下文),您就可以通过 loadView、viewDidLoad、viewWillAppear:animated:、viewDidAppear:animated 可靠地管理视图的生命周期:、viewWillDisappear:animated: 和 viewDidDisappear:animated: 和 viewDidUnload 方法(同样,请记住 viewDidUnload 不会总是被调用)。

您通常应该将视图控制器的视图传递给 addSubview: 的唯一时间是当您将根视图控制器的视图添加到窗口时。如果您想尝试使用嵌套视图控制器来管理非全屏子视图,则必须在适当的时间从全屏视图的控制器手动调用其 viewWill/DidAppear/Disappear:animated: 和 viewDidUnload 方法。

【讨论】:

注意:“视图控制器旨在管理全屏视图。”【参考方案2】:

viewDidUnload 在卸载UIViewControllersview 时调用,而不是在从view 中删除子视图时调用。

【讨论】:

当视图被隐藏并且 iOS 决定它需要更多内存并释放不可见视图时。 好的。所以它是内存部分和操作系统。谢谢! 不客气。确保为有帮助的答案投票。【参考方案3】:

viewdidunload 是 UIViewController 的一个方法。如果您使用 UIViewController 子类创建一个对象,并且该对象的视图从 superview 中删除,则将调用 viewdidunload。确保您的子视图是由 UIViewController 制作的。

【讨论】:

我的孩子仅继承自 UIViewController。但它没有被调用。还有建议吗?【参考方案4】:

另外需要注意的是 viewDidUnload 可能不会在 dealloc 之前执行。当 UIViewController 引用计数达到 0 时会发生这种情况。

正如 Xcode 模板所说:

- (void)viewDidUnload 
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;

【讨论】:

以上是关于viewdidunload 根本没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

长路漫漫,唯剑作伴--loadViewviewDidLoad及viewDidUnload的关系

loadViewviewDidLoad及viewDidUnload的关系(转)

ios5:停止视图被卸载/停止 viewDidUnload 被调用

没有为 UIscrollView 中的 viewControllers 调用 ViewDidUnload

没有 xib 文件的 alloc/init 初始化视图控制器不调用 viewDidUnload

viewWillDisappear, viewWillUnload viewDidUnload 从未调用