我们假设有一个标签栏控制器,带有两个标签A和B,其中A是导航控制器。
当用户在A中时,他可以按A1,然后按A2,这两个都是视图控制器。 A2上的后退按钮执行:
[self.navigationController popViewControllerAnimated:YES];
正确触发A2上的dealloc方法。
如果用户在A2中然后切换到选项卡B,我需要在A2上调用dealloc方法;因此我在TabBarController中实现了以下方法:
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController {
UINavigationController *nc = (UINavigationController*)tabBarController.selectedViewController;
[nc popToRootViewControllerAnimated:YES];
return YES;
}
但是在这个流程中,A2的dealloc方法永远不会被调用! 怎么可能从A2弹出到A1工作,而更改选项卡视图控制器没有被解除分配?
感谢任何提示!
DAN
答案 0 :(得分:1)
dealloc仅用于删除观察者和释放内存 - 当调用它时或者是否由运行时
e.g。
想一想释放与自动释放的情况(调用时的影响)或终止应用程序(根本不调用)
而不是依赖dealloc,写一个你明确调用的方法..例如像停止或完成或清理的东西
或...使用viewDidDisappear。
- 无论如何,不要依赖dealloc
答案 1 :(得分:0)
似乎在标签控制器切换到目标标签之前触发了didSelectViewController
。
因此,方法popToRootViewControllerAnimated
的执行正确弹出所有视图控制器,但无法真正释放可见的视图控制器,因为它当前正由应用程序描述。
为了实现我的结果,我已经找到了以下解决方案。
在对应于每个选项卡的第一个视图控制器的所有视图控制器的viewDidAppear
方法中,我执行popToRootViewControllerAnimated
(所有这些都是导航控制器)。