当我的容器 UIViewController 被解除分配或卸载时,我必须清理我的子 UIViewControllers 吗?

Posted

技术标签:

【中文标题】当我的容器 UIViewController 被解除分配或卸载时,我必须清理我的子 UIViewControllers 吗?【英文标题】:Must I cleanup my child UIViewControllers when my container UIViewController is dealloc-ed or unloaded? 【发布时间】:2012-06-12 20:59:54 【问题描述】:

我正在创建一个简单的容器 UIViewController 和一个子 UIViewController

我是否需要在我的容器UIViewControllerdeallocviewDidUnload 方法中发送孩子willMoveToParentViewController:removeFromParentViewController

我正在使用ARC

【问题讨论】:

【参考方案1】:

这可能会迟到,但我遇到了同样的问题。我用 NSLog 进行了测试,并且没有在子控制器上调用 dealloc 方法。

在我的例子中,我的父控制器有一个子控制器,但这个父控制器也是另一个超级父控制器的子控制器。

所以,我的解决方案是实现 willMoveToParentViewController 并删除那里的孩子。

- (void) willMoveToParentViewController:(UIViewController *)parent;

    if (parent == nil) 
        NSLog(@"removing my self");
        [_childViewController willMoveToParentViewController:nil];
        [_childViewController removeFromParentViewController];
        [_childViewController.view removeFromSuperview];
        _childViewController = nil;
    

但是,在我的例子中,我调用这个方法是因为这个父级是另一个父级控制器的子级。

// removing the parent from super parent controller
[_parentViewController willMoveToParentViewController:nil];
[_parentViewController removeFromParentViewController];
[_parentViewController.view removeFromSuperview];
_parentViewController = nil;

虽然我不知道你的情况,但希望这能帮助其他可能与我有同样问题的人。

【讨论】:

以上是关于当我的容器 UIViewController 被解除分配或卸载时,我必须清理我的子 UIViewControllers 吗?的主要内容,如果未能解决你的问题,请参考以下文章

从嵌入在容器视图中的视图控制器中分离

以编程方式嵌入 UIViewController?

当我的 UIViewController 被弹出时调用的方法?

自定义 UIView 在 View Controller 中被解包为 nil

使用 segue 向后导航时如何重新加载容器视图?

容器视图控制器不转发外观方法