1

我有一个导航控制器,里面有 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 方法。

谢谢, 奥贝德

4

2 回答 2

1

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

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

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

于 2012-08-07T13:39:00.843 回答
1

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

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

于 2012-08-07T13:47:35.607 回答