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上,而是在每个ViewController
的viewWillDisappear
方法上,因为这个方法肯定会在下一个ViewController
出现之前被调用。
【讨论】:
以上是关于poptorootviewcontroller不依次调用rootview控制器的dealloc方法和viewdidappear方法的主要内容,如果未能解决你的问题,请参考以下文章
需要用 popToRootViewController 发布中间视图吗?
从另一个选项卡调用 popToRootViewController
popToRootViewController 在 viewWillAppear 之前被调用