Dealloc没有被称为更改标签

时间:2013-08-29 10:25:55

标签: ios uiviewcontroller uinavigationcontroller uitabbarcontroller dealloc

我们假设有一个标签栏控制器,带有两个标签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

2 个答案:

答案 0 :(得分:1)

dealloc仅用于删除观察者和释放内存 - 当调用它时或者是否由运行时

e.g。
想一想释放与自动释放的情况(调用时的影响)或终止应用程序(根本不调用)

而不是依赖dealloc,写一个你明确调用的方法..例如像停止或完成或清理的东西

或...使用viewDidDisappear。

- 无论如何,不​​要依赖dealloc

答案 1 :(得分:0)

似乎在标签控制器切换到目标标签之前触发了didSelectViewController。 因此,方法popToRootViewControllerAnimated的执行正确弹出所有视图控制器,但无法真正释放可见的视图控制器,因为它当前正由应用程序描述。

为了实现我的结果,我已经找到了以下解决方案。 在对应于每个选项卡的第一个视图控制器的所有视图控制器的viewDidAppear方法中,我执行popToRootViewControllerAnimated(所有这些都是导航控制器)。