poptorootviewcontroller不依次调用rootview控制器的dealloc方法和viewdidappear方法

Posted

技术标签:

【中文标题】poptorootviewcontroller不依次调用rootview控制器的dealloc方法和viewdidappear方法【英文标题】:poptorootviewcontroller not calling dealloc methods and viewdidappear method of rootview controller in a sequence 【发布时间】:2012-08-07 12:08:00 【问题描述】:

我有一个导航控制器,里面有 4 个 VC。我有一个单例类,其委托属性设置为堆栈顶部的 VC。我在每个 VC 的 dealloc 方法中将此委托设置为 nil。我在 rootVC 的 viewdidappear 方法中设置委托。

当我从第 4 个 VC 弹回根 VC 时,调用 dealloc 方法(堆栈中所有 VC)和 viewdidappear 方法的顺序如下:

"FirstVC dealloc called"
"SecondVC dealloc called"
"viewdidappear of root VC is called"
"ThirdVC dealloc called"

现在,我面临的问题是委托被设置为 nil,即使我在根 VC 的 viewdidappear 方法中将其设置为 self(这也可以从控制流中看到)。我怎样才能防止这种情况?我希望在所有 VC 真正释放后调用 viewdidappear 方法。

谢谢, 奥贝德

【问题讨论】:

【参考方案1】:

由于您无法预测方法调用的顺序,除非 Apple 发布一些关于它们是什么的保证,也许您可​​以通过创建如下方法将单例编程为防御性的:

- (void)removeDelegate:(UIViewController *)oldDelegate;

如果委托与指定的旧委托匹配,则将其设置为 nil。

【讨论】:

【参考方案2】:

dealloc 在不再需要对象时自动调用。当您弹出ThirdVC 时,由于委托属性仍在保留它,因此不会调用dealloc。然后,当您的 rootVC 的 viewDidAppear 被调用时,它会将 rootVC 设置为委托。此时,不再需要您的第三个VC,这会触发dealloc

您可以做的一件事是将delegate属性设置为nil,而不是在dealloc上,而是在每个ViewControllerviewWillDisappear方法上,因为这个方法肯定会在下一个ViewController出现之前被调用。

【讨论】:

以上是关于poptorootviewcontroller不依次调用rootview控制器的dealloc方法和viewdidappear方法的主要内容,如果未能解决你的问题,请参考以下文章

需要用 popToRootViewController 发布中间视图吗?

从另一个选项卡调用 popToRootViewController

单击按钮时的poptorootviewcontroller

popToRootViewController 在 vi​​ewWillAppear 之前被调用

如何更改 popToRootViewController 的过渡样式?

应用程序进入后台时的popToRootViewController