如果从navigationController弹出时会释放ViewController?

Posted

技术标签:

【中文标题】如果从navigationController弹出时会释放ViewController?【英文标题】:If the UIViewController will be relesed when popped from the navigationController? 【发布时间】:2012-01-03 12:47:33 【问题描述】:

如下代码:

UIViewController *controller = [[UIViewController alloc] init];
[controller.view addSubView:myOtherController.view];
[self.navigationController pushViewController:controller];
[controller release];

而myOtherController是一个全局对象,不会被释放。 那么问题来了,当控制器弹出时,是否会被释放? 如果它不会被释放,我该如何验证呢? 谢谢!

【问题讨论】:

【参考方案1】:

它会在弹出时释放。 UINavigationController 保留推送的视图控制器,当然,在弹出时释放它们。

编辑:对象所有权是一种定向关联,但不是树:对象 A 拥有对象 B,而 B 可以由任意数量的其他对象拥有。

弹出的控制器拥有它的视图,而后者又拥有子视图。当弹出的控制器被释放时,它会释放它的视图,从而释放共享的子视图。共享子视图仍归某个其他对象所有,因此不会被释放。

这就是引用计数的思想。

【讨论】:

谢谢!但是弹出的控制器有一个尚未发布的子视图。我不确定在这种情况下是否会释放弹出的控制器。那么你能进一步解释一下吗?非常感谢! 控制器保留它的视图,保留它的子视图等。但是视图不保留父视图或控制器,所以它会被释放。 感谢您的解释!

以上是关于如果从navigationController弹出时会释放ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何从导航堆栈中推送/弹出uiviewcontroller时收到警报

如何从自定义 UIGestureRecognizer 触发 NavigationController 的 interactivePopGestureRecognizer

从 NavigationController 中移除 ViewController 后 AVPlayer 继续播放

TabBarController + NavigationController:推送和弹出问题

弹出到 NavigationController 堆栈中的特定 ViewController

关闭(或弹出)我手动添加的 NavigationController 不起作用